activerecord-import

レコードをいっぺんに複数作成するメソッドを以下のように書いてしまっておりました。

def import_hoges
hoges = params[:hoges]
hoges.each do |hoge|
Hoge.create!(
user_id: @login_user.id,
recorded_at: hoge[:recorded_at],
value: hoge[:value])
end
end

 


今回の用途だと約100弱のレコードが一度に作成されるので、
バルクインサート(activerecord-importの活用)にした方が良さそうと言うアドバイスをもらいました!

def import_hoges
hoges = params[:hoges]
hoge_objects = []
hoges.each do |hoge|
hoge_objects << Hoge.new(
user_id: @login_user.id,
recorded_at: hoge[:recorded_at],
value: hoge[:value])
end
Hoge.import hoge_objects
end

 

 

SQL一行で複数レコード保存できるようになりました!

INSERT INTO `hoges` (`id`,`huga_id`,`user_id`,`recorded_at`,`value`,`created_at`,`updated_at`) VALUES (NULL,6,25,'2019-08-18 00:00:00',3220.0,'2019-10-23 09:46:55','2019-10-23 09:46:55'),(NULL,6,25,'2019-08-19 00:00:00',0.0,'2019-10-23 09:46:55','2019-10-23 09:46:55'),(NULL,6,25,'2019-08-20 00:00:00',161.0,'2019-10-23 09:46:55','2019-10-23 09:46:55') ON DUPLICATE KEY UPDATE `hoges`.`updated_at`=VALUES(`updated_at`)

 

 

感想その他

以前少し調べたバルクインサートをやっと使う機会が来て嬉しかったです!
そしてコードレビューありがたいです!