1

我正在尝试使用 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 的要求:

[[数据,值],[日期,值]...]

4

7 回答 7

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)
于 2013-05-14T21:16:59.237 回答
1

此代码“Product.find(:all, :order => "created_at ASC")”您可以创建一个 :scope 并且您的控制器分配 @products = Product.order_by_created

@products.inject([]) do {|result, p| result << [p.created_at.strftime("%m/%d"), p.rating])}
于 2013-05-15T13:35:22.977 回答
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
于 2013-05-14T20:56:21.327 回答
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 "    ])"
于 2013-05-14T20:56:41.610 回答
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]]
于 2013-05-14T21:02:08.503 回答
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   
于 2013-05-14T21:23:13.607 回答
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)

我希望这有帮助。

于 2013-05-14T21:34:50.870 回答