Как получить строки в виде массивов (не хешей) в Sequel ORM?
В продолжении 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"}]
Есть ли способ, встроенный в 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]]
5 ответов
Если вы хотите просто массив массивов значений...
DB['select * from T'].map { |h| h.values }
похоже на работу
ОБНОВЛЕНИЕ с учетом обновленного требования порядка столбцов, соответствующего порядку запроса...
cols= [:a, :c, :b]
DB[:T].select{cols}.collect{ |h| cols.collect {|c| h[c]}}
не очень красивый, но гарантированный порядок такой же, как порядок выбора. Там, кажется, нет встроенного для этого. Вы можете сделать запрос на функцию.
Старые версии Sequel (до 2.0) в некоторых адаптерах имели возможность возвращать массивы вместо хешей. Но это вызвало множество проблем, никто не использовал его, и я не хотел поддерживать его, поэтому он был удален. Если вам действительно нужны массивы, вам нужно перейти на уровень соединения и использовать метод, специфичный для соединения:
DB.synchronize do |conn|
rows = conn.exec('SQL Here') # Hypothetical example code
end
Фактический необходимый вам код будет зависеть от используемого вами адаптера.
Ты пробовал это?
ds = DB['select a, b, c from T'].to_a
не уверен, что это работает, но попробуйте.
Я еще не нашел встроенный метод для возврата массива массивов строк, где значения в массивах строк упорядочены по порядку столбцов в исходном запросе. Следующая функция делает *, хотя я подозреваю, что внутренний метод может быть более эффективным:
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
Функция не очень полезна.