代码之家  ›  专栏  ›  技术社区  ›  stevec Zxeenu

如何以数组的形式获取表,其中每个子数组是一列(而不是一行)

  •  1
  • stevec Zxeenu  · 技术社区  · 6 年前

    This 答案显示了如何以数组的形式返回Rails表 行行 . 这是怎么做到的 柱状 ,也就是说,其中每个子数组都是表中的列/属性?

    下面介绍如何将表作为数组按行返回,以供参考。

    my_array = Mymodel.all.map {|e| e.attributes.values}
    
    3 回复  |  直到 6 年前
        1
  •  2
  •   Yurii Verbytskyi    6 年前

    这个有效,打电话 SELECT n次(n=mymodel.column\u name.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) }
    

    更好更快的解决方案是 this answer

        2
  •  2
  •   ray    6 年前

    一种自然而合理的数据库有效方法是使用 Array#transpose 在数组中 the other answer :

    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>
    ]
    
        3
  •  1
  •   Mark Merritt    6 年前

    你可以使用 pluck 获取列值并将其推送到数组中。有点像…

    your_array = []
    
    Mymodel.column_names.each do |col|
      sub_arr = Mymodel.pluck(col.to_sym)
      your_array.push(sub_arr)
    end