导出为CSV访问数组的元素并插入换行符

时间:2013-07-01 22:03:29

标签: ruby-on-rails csv gem export-to-csv

我在作业集合中的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循环逻辑的任何想法?

2 个答案:

答案 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”方法的替代用法。它有效......