Естественным и достаточно эффективным подходом к базе данных будет использование 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>
]