Ruby - 生成逗号分隔数组的数组

时间:2013-05-14 20:42:53

标签: ruby-on-rails ruby ruby-on-rails-3

我正在尝试使用GoogleVisualr创建Google图表。

此输入有效:

data_table.add_rows([
      ['04/14', 1],  
      ['04/15', 2], 
      ['04/16', 3], 
      ['04/17', 4], 
      ['04/18', 5], 
      ['04/19', 1], 
      ['04/20', 12], 
      ['04/21', 13], 
      ['04/24', 14], 
      ['04/14', 15], 
      ['04/24', 16], 
      ['04/22', 17], 
      ['04/14', 18], 
      ['04/4', 19], 
    ])

我目前正在使用:

Product.find(:all, :order => "created_at ASC").each do |p|
    data_table.add_rows([
     [p.created_at.strftime("%m/%d"), p.rating]
    ])

返回:

01/13
2
01/20
3
02/22
2
03/14
2
03/19
2
04/14
1
04/15
2
04/17
2
05/14
2
05/14
2
05/14
2
05/14
2...

如何格式化数组以匹配GoogleVisualr所需的内容:

  

[[data,value],[date,value] ...]

7 个答案:

答案 0 :(得分:3)

无需使用循环,只需使用map

rows = Product.all.order("created_at ASC").map do |p| 
 [p.created_at.strftime("%m/%d"), p.rating]
end
data_table.add_rows(rows)

答案 1 :(得分:1)

此代码“Product.find(:all,:order =>”created_at ASC“)”您可以创建:范围,您的控制器会分配@products = Product.order_by_created

@products.inject([]) do {|result, p| result << [p.created_at.strftime("%m/%d"), p.rating])}

答案 2 :(得分:0)

由于您已经遍历每一行,因此您只需使用DataTable#add_row

Product.find(:all, :order => "created_at ASC").each do |p|
  data_table.add_row([p.created_at.strftime("%m/%d"), p.rating])
end

答案 3 :(得分:0)

将其变为字符串并在其中插入值。

puts "data_table.add_rows(["
Product.find(:all, :order => "created_at ASC").each do |p|
  puts "['#{p.created_at.strftime("%m/%d")}', #{p.rating}],"
end
puts "    ])"

答案 4 :(得分:0)

尝试这样的事情

pry(main)> result = []
=> []
pry(main)> Project.find(:all, :order => "created_at ASC").each do |p|
pry(main)*   result << [p.created_at.strftime("%m/%d"), p.id]
pry(main)* end  
pry(main)> result
=> [["02/05", 1],
["02/14", 6],
["02/15", 7],
["02/18", 8]]

答案 5 :(得分:0)

可能不是最有效的方式,但过早的优化是所有邪恶的根源:

@products = Product.all(:order => 'created_at ASC')  
@csv = CSV.generate do |csv|
        csv << ["Secret", "Timestamp"]
        @products.each { |secret|
                csv << ["#{secret.story}", "#{secret.updated_at.strftime('%s')}"]
        }
    end
@csv   

答案 6 :(得分:0)

如果你在Winston的Github页面上查看Google Visualr API(https://github.com/winston/google_visualr),你会发现add_rows方法需要一个嵌套数组,其中数组的每个元素都是另一个大小的数组(长度)2。第一个元素e[0]是日期,第二个元素e[1]是该日期的数据值。以这种格式传递数据,它应该可以正常工作。

看起来你的代码已经应该已经这样做了,据我们所知,这里没有实际存在你的机器上。但是,您的代码在add_rows方法中为每次迭代调用each方法,并为data_table.add_rows方法提供仅具有一个数组的嵌套数组在里面。

所以不要看起来像这样:

[ ['04/14', 1], ['04/15', 2], ['04/16', 3], ['04/17', 4] ]

并且像往常一样调用add_rows一次,你这样反复调用add_rows

add_rows ( [ ['04/14', 1] ] )

add_rows ( [ ['04/15', 2] ] )

add_rows ( [ ['04/16', 3] ] )

add_rows ( [ ['04/17', 4] ] )

每个数据点一次。

你应该做的是使用你的each迭代器将每个日期及其相应的数据值放入一个数组中,然后用该数组作为参数调用add_rows。像这样:

my_array = []

Product.find(:all, :order => "created_at ASC").each do |p|
  my_array <<  [p.created_at.strftime("%m/%d"), p.rating]
end

data_table.add_rows(my_array)

我希望这会有所帮助。