我在作业集合中的Mongo中存储了一个文档,如下所示:
"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 } ]
产品是一个数组数组。当您导出为CSV时,当您访问“产品”键时(当然)会打印出整行。
我需要做什么:
访问内部产品并抓取每个元素,在CSV中的相应列中打印它们并在CSV中插入换行符,使它们在相应的列下排列。
类似的东西:
ID PRICE QUANTITY TAX ID价格数量税 ID价格数量税
左上方的第1行有实际的JOB NUMBER,但是第2行和第3行没有那个(这将是多余的)。
疯狂的部分是我需要一些可以抓取的逻辑但是许多部分被添加到作业中(从无到无穷)。
有没有人知道如何解决这个问题?
我正在使用逗号gem,所以我的模型中有一些代码:
产品做|产品| #我在这里尝试了无数的组合 - 没有一个能奏效 端
帮助!
更新:
这样的东西得到了产品中的第一个元素(以及结构相同的付款)
products do |products|
products.each do |p|
@pid = p["id"]
@pid = Inventory.find_by_id(@pid)
if @pid == nil
@pid = "None"
else
@pid = @pid.parts_name
end
end
@pid
end
products 'Price' do |products|
products.each do |p|
@price = p["price"]
end
@price
end
products 'Quantity' do |products|
products.each do |p|
@qty = p["quantity"]
end
@qty
end
products 'Tax' do |products|
products.each do |p|
@tax = (p["tax"].to_f * (p["price"].to_f * p["quantity"].to_i)).round(2)
end
@tax
end
关于for循环逻辑的任何想法?
答案 0 :(得分:0)
也许这样的事情可以做到
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
答案 1 :(得分:0)
以下是最终解决方案的信息:
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
最后一部分是其中一个“搞砸了我会尝试一切”的方法,我偶然发现了“to_sentence”方法的替代用法。它有效......