0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

対象のレコードが存在すれば更新・しなければ登録

Posted at

対象のレコードが存在すれば更新・しなければ登録

Ruby on Rails で表題の処理がしたい時の書き方です。

例:
product_id=1のレコードにprice=1000

レコードが存在すれば、price=1000に更新
存在しなければ、product_id=1price=1000のレコードを登録

書き方

まずfind_or_initialize_byを使用します。
このメソッドは

  • 対象のレコードが存在しない場合はレコードを生成
  • 対象のレコードが存在すれば既存のレコードを取得
product = Product.find_or_initialize_by(product_id: 1)

次に、テーブルへ登録/更新をします。
書き方は assign_attributes + saveupdate メソッドで書く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/

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?