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