対象のレコードが存在すれば更新・しなければ登録
Ruby on Rails で表題の処理がしたい時の書き方です。
例:
product_id=1
のレコードにprice=1000
レコードが存在すれば、price=1000
に更新
存在しなければ、product_id=1
のprice=1000
のレコードを登録
書き方
まずfind_or_initialize_by
を使用します。
このメソッドは
- 対象のレコードが存在しない場合はレコードを生成
- 対象のレコードが存在すれば既存のレコードを取得
product = Product.find_or_initialize_by(product_id: 1)
次に、テーブルへ登録/更新をします。
書き方は assign_attributes + save
と update
メソッドで書く2通りがあります
update
メソッド内で アサインと保存(assign_attributes + save
)をしているので同じ処理をしています(※1)
# update_attributes + save の書き方の場合
product.assign_attributes(price: 1000)
product.save
# updateのみ の書き方の場合
product.update(price: 1000)
(※1)どちらがいいのか?
個人的にはupdateは更新しかしないように見えるので、行が多くなりますが update_attributes + save の方が可読性は高いと感じます。
ただrailsに詳しい人がチームに多ければupdateでスッキリ書くのも良いかと思います。
■参考にさせていただいた記事
https://railsdoc.com/page/find_or_initialize_by
https://qiita.com/taimuzu/items/0a21738d018f475d63ae
https://www.audia.jp/blog/rubyonrails-activerecord-update-method-comparison/