在Sequel ORM for Ruby中,Dataset
类有一个all
方法,它产生一个行哈希数组:每一行都是一个哈希,列名作为键。
例如,给定表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_rows
在ActiveRecord中的工作方式?像这样:
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]]
答案 0 :(得分:10)
旧版本的Sequel(2.0之前的版本)能够在某些适配器中返回数组而不是哈希值。但它引起了许多问题,没有人使用它,我不想维护它,所以它被删除了。如果您真的需要数组,则需要下拉到连接级别并使用特定于连接的方法:
DB.synchronize do |conn|
rows = conn.exec('SQL Here') # Hypothetical example code
end
您需要的实际代码取决于您使用的适配器。
答案 1 :(得分: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]}}
不是很漂亮,但保证订单与选择订单相同。 似乎没有内置功能。 您可以请求该功能。
答案 2 :(得分:2)
DB [:表]。凡()select_map。(:id)的
答案 3 :(得分: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
函数不是很有用。
答案 4 :(得分:0)
ds = DB['select a, b, c from T'].to_a
不确定它是否有效但是试一试。