Как получить строки в виде массивов (не хешей) в 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

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

БД [: таблица]..Гд () select_map(: ID)

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

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

Другие вопросы по тегам