2016-04-12 49 views
0

有點混亂,我在這裏試圖讓這個工作。 我有一個商店的產品數據庫。 我給出的是一個CSV文件,包含3列和500多個條目,ts_code cost_price和sell_price。Rails 4 rake任務來更新記錄。通過ts_code查找並使用CSV進行更新

所以我需要一個可以運行的任務,找到所有匹配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 

我也知道我需要告訴它來更新哪些列,但我不知道從哪裏把他們像成本&出售價格。 如果任何人都可以提供幫助,那會很棒。

仍然試圖讓這個工作以某種方式,接下來我嘗試的是這個,但得到一個錯誤未定義的方法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 

回答

0

你的第二個例子有find_by 1語法正確的 - 你需要調用它的Spree::Product對象。您也可以撥打Spree::Product.find_by_ts_code(row["ts_code"])作爲快捷方式。

此外,而不是你的|| new語法,你可能看find_or_create_by2 - 這樣的事情:

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

最後,update節省話費給你,所以你的電話save!是多餘的。

+0

非常感謝您的幫助Brian多數民衆贊成在工作,我感謝它! – shaneklive