Ruby on rails 导出为CSV访问数组元素并插入换行符
我在jobs集合中的Mongo中存储了一个文档,如下所示:Ruby on rails 导出为CSV访问数组元素并插入换行符,ruby-on-rails,csv,gem,export-to-csv,Ruby On Rails,Csv,Gem,Export To Csv,我在jobs集合中的Mongo中存储了一个文档,如下所示: "products" : [ { "id" : "51bc0cc39727911120000145", "price" : 19, "quantity" : 1, "tax" : 0 }, { "id" : "51bc0cc39727911120000171", "price" : 14, "quantity" : 1, "tax" : 0 }, { "id" : "51bc0cca
"products" : [ { "id" : "51bc0cc39727911120000145", "price" : 19, "quantity" : 1, "tax" : 0 }, { "id" : "51bc0cc39727911120000171", "price" : 14, "quantity" : 1, "tax" : 0 }, { "id" : "51bc0cca9727911120000a23", "price" : 308, "quantity" : 1, "tax" : 0.092500001192093 } ]
products是一组数组。当您导出为CSV时,当您访问“products”键时(自然地),这整行将打印出来
我需要做的是:
到达产品内部并抓取每个元素,在CSV的相应列中打印它们,并在CSV中插入换行符,以便它们在相应列下对齐
比如:
价格数量税
价格数量税
价格数量税
左上方的第1行有实际的作业编号,但第2行和第3行没有(这是多余的)
疯狂的部分是我需要一些逻辑,无论有多少部分被添加到工作中(从无到无限)
有人知道怎么做吗
我使用逗号gem,因此我的模型中有一些代码:
产品做|产品|
#我在这里尝试过数不清的组合,但都不管用
结束
救命啊
更新:
类似的东西从产品中获得第一个元素(以及结构相同的支付)
关于for循环逻辑有什么想法吗?也许像这样的东西就可以了
column_names = ["id","price","quantity","tax"]
CSV.generate do |csv|
csv << column_names
products.each do |p|
@pid = Inventory.find_by_id(p["id"])
csv << [@pid ? @pid.parts_name : "none", p["price"], p["quantity"], (p["tax"].to_f * (p["price"].to_f * p["quantity"].to_i)).round(2) ]
end
end
column_name=[“id”、“price”、“quantity”、“tax”]
CSV.generate do | CSV|
csv以下是最终解决方案的简介:
products do |products|
@prod=[]
products.each do |p|
@pid = p["id"]
@pid = Inventory.find_by_id(@pid)
if @pid == nil
@prod << "None"
else
@prod << @pid.parts_name
end
end
@prod.to_sentence(:words_connector=>"\r",:two_words_connector=>"\r",:last_word_connector=>"\r")
end
products do | products|
@产品=[]
产品。每个产品都有| p|
@pid=p[“id”]
@pid=库存。通过_id(@pid)查找_
如果@pid==nil
@产品“\r”,:最后一个单词\u连接器=>“\r”)
结束
最后一部分是“去他妈的,我会尝试一切”的方法之一,我偶然发现了“to_句子”方法的另一种用法。它可以工作…看起来产品是一个哈希数组!
products do |products|
@prod=[]
products.each do |p|
@pid = p["id"]
@pid = Inventory.find_by_id(@pid)
if @pid == nil
@prod << "None"
else
@prod << @pid.parts_name
end
end
@prod.to_sentence(:words_connector=>"\r",:two_words_connector=>"\r",:last_word_connector=>"\r")
end