如何一次更新has_many模型

时间:2017-03-27 04:18:51

标签: ruby-on-rails activerecord

公司股票价格有一个csv文件,每个公司都有code列,这是唯一的。但Company模型的主要列是id

我想从CSV文件更新公司的所有价格。

csv = CSV.parse("code,date,amount\n3000,2017-03-27,300\n4000,2017-03-27,251", headers: true, converters: [:integer, :date])
csv.each do |row|
  company_id = Company.select(:id).find_by(code: row['code'])&.id
  next if company_id.nil?
  Price.find_or_create_by(date: row['date'], amount: row['amount'], company_id: company_id)
end          

所以我不得不像这样使用each循环。有没有更有效的方法来实现这个功能?

1 个答案:

答案 0 :(得分:0)

有很多方法可以做到这一点,但这里有一个。

company = Company.where(code: row['code').select(:id).first
if (company)
 ...
end

您还可以在价格上执行sql INCLUDE或LEFT JOIN,但会牺牲可读性。或者你可以在公司上使用.tap。但我更喜欢能够快速了解​​一年前我在阅读代码时所做的事情。