我正在尝试使用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] ...]
答案 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)
我希望这会有所帮助。