Как получить таблицу в виде массива массивов, где каждый вложенный массив является столбцом (а не строкой) - PullRequest
0 голосов
/ 27 января 2019

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

Для справки, вот каквернуть таблицу в виде массива массивов по строке

my_array = Mymodel.all.map {|e| e.attributes.values}

Ответы [ 3 ]

0 голосов
/ 27 января 2019

Вы можете использовать pluck, чтобы получить значения столбцов и вставить их в ваш массив.Что-то вроде ...

your_array = []

Mymodel.column_names.each do |col|
  sub_arr = Mymodel.pluck(col.to_sym)
  your_array.push(sub_arr)
end
0 голосов
/ 28 января 2019

Естественным и достаточно эффективным подходом к базе данных будет использование Array#transpose в массиве массивов из другого ответа :

by_column = Mymodel.all.map { |e| e.attributes.values }.transpose
# Just add this ---------------------------------------^^^^^^^^^^

Сравнение с другими подходами,

bm =  Benchmark.bm do |x| 
  x.report { my_array = User.column_names.map { |column| User.all.map(&column.to_sym) } }
  x.report { my_array = User.column_names.map { |column| User.pluck(column.to_sym) } }
  x.report { by_column = User.all.map { |e| e.attributes.values }.transpose }
end

В двух предыдущих подходах, предоставленных Юрий Вербицкий , модель первого подхода загружает N раз, а второй запускает select запрос N числораза.

И при условии, что третий подход извлечет данные в одном запросе, которые оптимизируют производительность превосходным образом, как показано в следующем результате,

[
    [0] #<Benchmark::Tms:0xd6601f4 @label="", @real=0.05709833199989589, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=0.040000000000000036, @total=0.040000000000000036>,
    [1] #<Benchmark::Tms:0xd58e5f0 @label="", @real=0.02451071499990576, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=0.019999999999999907, @total=0.019999999999999907>,
    [2] #<Benchmark::Tms:0xd4e5eb4 @label="", @real=0.004674662000070384, @cstime=0.0, @cutime=0.0, @stime=0.0, @utime=0.010000000000000009, @total=0.010000000000000009>
]
0 голосов
/ 27 января 2019

Этот работает, звонит SELECT n раз (n = Mymodel.column_names.count)

my_array = Mymodel.column_names.map { |column| Mymodel.all.map(&column.to_sym) }

Этот вызов будет SELECT column_name вместо SELECT * n раз

my_array = Mymodel.column_names.map { |column| Mymodel.pluck(column.to_sym) }

Лучшее и более быстрое решение - этот ответ

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...