Rails 4 rake任务更新记录。按ts_code查找并使用CSV

时间:2016-04-12 17:02:41

标签: ruby-on-rails csv task rake update-all

有点凌乱,我在这里试图让它发挥作用。 我有一个商店,里面有产品数据库。 我得到的是一个包含3列和500多个条目的CSV文件,ts_code cost_price和sell_price。

所以我需要一个可以运行的任务,找到与ts_code匹配的所有产品,然后更新这些产品的cost_price和sell_price。

我已尝试编辑我用于导入产品的任务,如下所示。

原始任务

require 'csv'
desc "Imports a CSV file into an ActiveRecord table"
task :import, [:filename] => :environment do
CSV.foreach('csv/vow.csv', :headers => true) do |row|
Spree::Product.create!(row.to_hash)
end
end

我希望这样的事情可行,但我现在已经陷入困境。

require 'csv'
desc "Imports a CSV file into an ActiveRecord table"
task :update, [:filename] => :environment do
CSV.foreach('csv/vow.csv', :headers => true) do |row|
a = Spree::Product.find_by(:ts_code)
Spree::Product.update_all!(a, row.to_hash)
end
end

我也知道我需要告诉它要更新哪些列,但我不确定将它们放在哪里如cost&出售价格。 如果有人能提供帮助那就太棒了。

仍然试图以某种方式让这个工作,我尝试的下一件事是这个,但得到一个错误未定义的方法find_by。语法错误,不知道我有多接近。

require 'csv'
desc "Imports a CSV file into an ActiveRecord table"
task :update, [:filename] => :environment do
CSV.foreach('csv/recharge_pricing.csv', :headers => true) do |row|
product = find_by(ts_code: row["ts_code"]) || new
parameters = ActionController::Parameters.new(row.to_hash)
product.update(parameters.permit(:cost_price,:price))
product.save!
end
end

1 个答案:

答案 0 :(得分:0)

您的第二个示例使find_by 1语法正确 - 您需要在Spree::Product对象上调用它。您也可以将Spree::Product.find_by_ts_code(row["ts_code"])称为快捷方式。

此外,您可以查看|| new 2,而不是find_or_create_by语法,而不是这样:

product = Spree.Product.find_or_create_by(ts_code: row["ts_code"])

最后,update来电为您保存,因此save!来电是多余的。