2014-08-29 59 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