如何在续集ORM中将行作为数组(而不是哈希)?

jwf*_*arn 6 ruby sequel

Sequel ORM for Ruby中,Dataset该类有一个all生成行哈希数组的方法:每行都是一个以列名作为键的哈希.

例如,给定一个表T:

a  b   c
--------------
0  22  "Abe"
1  35  "Betty"
2  58  "Chris"
Run Code Online (Sandbox Code Playgroud)

然后:

ds = DB['select a, b, c from T']
ah = ds.all # Array of row Hashes
Run Code Online (Sandbox Code Playgroud)

应该产生:

[{"a":0,"b":22,"c":"Abe"},{"a":1,"b":35,"c":"Betty"},{"a":2,"b":58,"c":"Chris"}]
Run Code Online (Sandbox Code Playgroud)

是否有一种内置于Sequel的方法来生成一个行数组数组,其中每一行只是查询中指定顺序中每行值的数组?select_rows在ActiveRecord 中如何工作?像这样的东西:

aa = ds.rows # Array of row Arrays
Run Code Online (Sandbox Code Playgroud)

会产生:

[[0,22,"Abe"],[1,35,"Betty"],[2,58,"Chris"]]
Run Code Online (Sandbox Code Playgroud)

注意:表达式:

aa = ds.map { |h| h.values }
Run Code Online (Sandbox Code Playgroud)

生成一个数组数组,但不保证行中值的顺序与原始查询中请求的顺序相匹配.在此示例中,aa可能看起来像:

[["Abe",0,22],["Betty",1,35],["Chris",2,58]]
Run Code Online (Sandbox Code Playgroud)

Jer*_*ans 10

旧版本的Sequel(2.0之前的版本)能够在某些适配器中返回数组而不是哈希值.但它引起了许多问题,没有人使用它,我不想维护它,所以它被删除了.如果您确实需要数组,则需要下拉到连接级别并使用特定于连接的方法:

DB.synchronize do |conn|
  rows = conn.exec('SQL Here') # Hypothetical example code
end
Run Code Online (Sandbox Code Playgroud)

您需要的实际代码取决于您使用的适配器.


Cri*_*s R 6

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


Jim*_*ris 3

如果您只想要一个值数组的数组......

DB['select * from T'].map { |h| h.values }
Run Code Online (Sandbox Code Playgroud)

似乎有效

考虑到与查询顺序匹配的列顺序的更新要求,更新...

cols= [:a, :c, :b]
DB[:T].select{cols}.collect{ |h| cols.collect {|c| h[c]}}
Run Code Online (Sandbox Code Playgroud)

不是很漂亮,但保证顺序与选择顺序相同。似乎没有内置函数可以执行此操作。您可以提出该功能的请求。