6

RubyのSequelORMでは、クラスDatasetallハッシュの配列を生成するメソッドがあります。各行は、列名をキーとして持つハッシュです。

たとえば、テーブルTが与えられます。

a  b   c
--------------
0  22  "Abe"
1  35  "Betty"
2  58  "Chris"

それから:

ds = DB['select a, b, c from T']
ah = ds.all # Array of row Hashes

生成する必要があります:

[{"a":0,"b":22,"c":"Abe"},{"a":1,"b":35,"c":"Betty"},{"a":2,"b":58,"c":"Chris"}]

Sequelに組み込まれて、代わりに行配列の配列を生成する方法はありますか?各行は、クエリで指定された順序で各行の値のみの配列です。select_rowsActiveRecordでどのように機能しますか?このようなもの:

aa = ds.rows # Array of row Arrays

これは以下を生成します:

[[0,22,"Abe"],[1,35,"Betty"],[2,58,"Chris"]]

注:式:

aa = ds.map { |h| h.values }

配列の配列を生成しますが、行の値の順序は、元のクエリで要求された順序と一致することが保証されていません。この例では、aa次のようになります。

[["Abe",0,22],["Betty",1,35],["Chris",2,58]]
4

5 に答える 5

10

Sequelの古いバージョン(2.0より前)には、一部のアダプターでハッシュの代わりに配列を返す機能がありました。しかし、それは多くの問題を引き起こし、誰もそれを使用しませんでした、そして私はそれを維持したくなかったので、それは削除されました。本当にアレイが必要な場合は、接続レベルにドロップダウンして、接続固有の方法を使用する必要があります。

DB.synchronize do |conn|
  rows = conn.exec('SQL Here') # Hypothetical example code
end

必要な実際のコードは、使用しているアダプターによって異なります。

于 2011-04-25T17:10:06.497 に答える
4

DB [:table] .where()。select_map(:id)

于 2016-05-06T01:03:38.747 に答える
3

値の配列の配列だけが必要な場合...

DB['select * from T'].map { |h| h.values }

うまくいくようです

クエリの順序に一致する列の順序の更新された要件を指定してUPDATE..

cols= [:a, :c, :b]
DB[:T].select{cols}.collect{ |h| cols.collect {|c| h[c]}}

あまりきれいではありませんが、保証された順序は選択した順序と同じです。これを行うための組み込みはないようです。機能をリクエストできます。

于 2011-04-22T00:41:44.993 に答える
0

行配列の値が元のクエリの列順序で並べ替えられている行配列の配列を返す組み込みメソッドをまだ見つけていません。次の関数は*機能しますが、内部メソッドの方が効率的であると思われます。

def rows( ds )
  ret = []
  column_keys = ds.columns  # guaranteed to match query order?
  ds.all { |row_hash|
    row_array = []
    column_keys.map { |column_key| row_array << row_hash[column_key] }
    ret << row_array
  }
  ret
end

*この関数は、によって返される配列の順序によって異なりますDataset.columns。この順序が定義されていない場合、このrows関数はあまり役に立ちません。

于 2011-04-22T14:56:08.543 に答える
0

これを試しましたか?

ds = DB['select a, b, c from T'].to_a

それが機能するかどうかはわかりませんが、試してみてください。

于 2014-02-22T05:14:14.067 に答える