我正在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
答案 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)
为了排除故障......