0

我有一个文档存储在工作集合中的 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 } ]

products 是一个数组数组。当您导出为 CSV 时,当您访问“产品”键时(自然)会打印出整行。

我需要做什么:

到达产品内部并抓取每个元素,将它们打印在 CSV 中的适当列中,并在 CSV 中插入换行符,使它们在适当的列下对齐。

就像是:

ID 价格 数量税 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 循环逻辑的任何想法?

4

2 回答 2

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
于 2013-07-01T23:25:26.583 回答
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”方法的另一种用法。有用...

于 2013-07-07T10:07:35.960 回答