Rails CSV导出 - 添加自定义字段

时间:2014-08-29 04:49:26

标签: ruby-on-rails

我正在Rails中构建电子商务应用。我有一种方法可以导出订单模型和运输详细信息。下面的方法按原样工作,但我想在另一个模型的导出中添加一列。

我的订单模型有一个product_id,它与具有产品名称的产品表相连接。我想添加产品名称。所以像order.product.name。我如何将其添加到下面?

这是我的订单中的方法.rb:

 def self.to_csv(orders)
 wanted_columns = [:id, :shipname, :shipaddress, :shipcity, :shipstate, :shipzip]
  CSV.generate do |csv|
    csv << wanted_columns
    orders.each do |order|
    csv << order.attributes.values_at(*wanted_columns)
   end
  end
 end

1 个答案:

答案 0 :(得分:2)

您可以简单地将其添加到您的行中,如下所示:

 def self.to_csv(orders)
   wanted_columns = [:id, :shipname, :shipaddress, :shipcity, :shipstate, :shipzip]
   CSV.generate do |csv|
     csv << wanted_columns.insert(-1, :product_name)
     orders.each do |order|
       csv << order.attributes.values_at(*wanted_columns).insert(-1, order.product.name)
     end
   end
 end

insert方法inserts the given values before the element with the given index.

负数索引从数组末尾向后计数,其中-1是最后一个元素。

返回结果数组。

为了简化,在这种情况下,这个:

wanted_columns = [:id, :shipname, :shipaddress, :shipcity, :shipstate, :shipzip]
CSV.generate do |csv|
  csv << wanted_columns.insert(-1, :product_name)
end

表现应完全相同:

CSV.generate do |csv|
  csv << [:id, :shipname, :shipaddress, :shipcity, :shipstate, :shipzip, :product_name]
end

同样的原则适用于由:

生成的数组
order.attributes.values_at(*wanted_columns)

如果这不起作用,请尝试简化示例,并在将数组添加到数组之前检查数组是否正确。您可以另外简化:

orders.each do |order|
  csv << order.attributes.values_at(*wanted_columns).insert(-1, order.product.name)
end

为:

csv << orders.first.attributes.values_at(*wanted_columns).insert(-1, orders.first.product.name)

为了排除故障......