2014-08-29 56 views
0

我正在Rails中构建电子商务应用程序。我有一个方法来导出包含送货细节的订单模型。下面的方法按原样工作,但我想从另一个模型的导出中添加一列。Rails CSV导出 - 添加自定义字段

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

这是我在我的order.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 
+0

如果你有模型'order'和第二模型之间的关联,然后使用畅通无阻这行'csv << order.product.name'。 – stackoverflowery 2014-08-29 04:54:26

+0

如果您提供两种模型的定义,那么我们可以提供更准确的提示/解决方案。 – stackoverflowery 2014-08-29 04:56:33

+0

我有这个协会。我更详细地更新了这篇文章。我会在哪里放置你提到的csv系列?我如何将它添加到orders.attributes行? – Moosa 2014-08-29 05:00:45

回答

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是最后一个元素。它返回结果数组。

为了简化,在此情况下,这样的:

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

相同的主要适用于由所产生的阵列:

order.attributes.values_at(*wanted_columns) 

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

应该表现为完全一样的

如果这不起作用,请尝试简化示例,并在添加之前检查阵列的正确性到阵列。您可能还简化:

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) 

为了排除故障的目的...

+0

这给了我空白列的航运细节,然后最后一列没有标题,但有产品名称。 – Moosa 2014-08-29 05:10:20

+0

我不确定这是为什么,但我添加了一些额外的信息给你,以便更好地理解为什么这应该起作用,并希望确定它为什么不起作用。 – 2014-08-29 05:32:26