公司股票价格有一个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
循环。有没有更有效的方法来实现这个功能?
答案 0 :(得分:0)
有很多方法可以做到这一点,但这里有一个。
company = Company.where(code: row['code').select(:id).first
if (company)
...
end
您还可以在价格上执行sql INCLUDE或LEFT JOIN,但会牺牲可读性。或者你可以在公司上使用.tap。但我更喜欢能够快速了解一年前我在阅读代码时所做的事情。