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

Rails 4 rake task to update records. Find by ts_code and update with CSV

有点乱,我在这里试图让它发挥作用。 我有一家带有产品数据库的商店。 我得到的是一个包含 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

我也知道我需要告诉它要更新哪些列,但我不确定将它们放在哪里,比如成本和 sell_price。 如果有人能提供帮助那就太好了。

仍在尝试以某种方式让它工作,接下来我尝试的是这个,但出现错误未定义方法 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

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

此外,您可以查看 find_or_create_by 2 语法,而不是您的 || new 语法 - 如下所示:

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

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