Как получить строки в виде массивов (не хешей) в Sequel ORM? - PullRequest
6 голосов
/ 22 апреля 2011

В Sequel ORM для 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"}]

Есть ли способ, встроенный в сиквелвместо этого создать массив массивов строк, где каждая строка является массивом только значений в каждой строке в порядке, указанном в запросе ?Вроде как 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]]

Ответы [ 5 ]

10 голосов
/ 25 апреля 2011

Старые версии Sequel (до 2.0) имели возможность в некоторых адаптерах возвращать массивы вместо хешей.Но это вызвало множество проблем, никто не использовал его, и я не хотел поддерживать его, поэтому он был удален.Если вам действительно нужны массивы, вам нужно перейти на уровень соединения и использовать метод, специфичный для соединения:

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

Фактический необходимый код будет зависеть от используемого вами адаптера.

3 голосов
/ 22 апреля 2011

Если вы хотите просто массив значений ...

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

кажется, работает

ОБНОВЛЕНИЕ с учетом обновленного требования порядка столбцов, соответствующего порядку запроса ...

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

не очень красивый, но гарантированный порядок такой же, как и порядок выбора. Там, кажется, нет встроенного для этого. Вы можете сделать запрос на функцию.

2 голосов
/ 06 мая 2016

DB [: таблица] .гд () select_map. (: ID) * * +1001

0 голосов
/ 22 февраля 2014

вы пробовали это?

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

не уверен, что это работает, но попробуйте.

0 голосов
/ 22 апреля 2011

Я еще не нашел встроенный метод для возврата массива массивов строк, где значения в массивах строк упорядочены по порядку столбцов в исходном запросе.Следующая функция * делает, хотя я подозреваю, что внутренний метод мог бы быть более эффективным:

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 функция не очень полезна.

...