ウェブエンジニア珍道中

日々の技術的に関する経験を書いていきます、脱線もします。

RailsのActiveRecordでcreate_or_updateを分岐なしでスマートにする方法

最近見つけたので紹介します。 今回は本(Book)モデルを例題にします。

方法

こんな感じでできます。

book = Book.find_or_initialize_by(id: 1)
# book = Book.find_or_initialize_by(name: "こころ") # idじゃなくてもOK

book.update_attributes(
  name:   "こころ",
  author: "夏目漱石"
)

解説

find_or_initialize_byメソッドは引数で与えられた要素を使って検索を行います。

見つかった時にはインスタンスを返し、見つからなかった場合は新しくインスタンスを作って返します。

あとは update_attributesメソッドを使ってDBに値を保存してます。このメソッド内でcreateかupdateの判定はしてくれているようです。

これでif文がぐっと減りますね!