2016-04-12 9 views
0

私はここでこれを動作させようとしています。 私は製品のデータベースを持つ店を持っています。 私が与えたことは、3つの列と500以上のエントリ、ts_code cost_priceとsell_priceを持つCSVファイルです。Rails 4レコードを更新するレーキタスク。 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 

また、私は更新するように何列にそれを伝える必要があります知っているが、私は、コスト& 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 

答えて

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

ブライアンは今働いていて、ありがとう! – shaneklive

関連する問題