6

在 Ruby 的Sequel ORM 中,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_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 }

似乎工作

更新给定与查询顺序匹配的列顺序的更新要求...

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

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

于 2011-04-22T00:41:44.993 回答
0

你试过这个吗?

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

不确定它是否有效,但试一试。

于 2014-02-22T05:14:14.067 回答
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 回答