railsで無ければ新規作成、有れば更新をしたい時はfind_or_initialize_byとupdate_attributesでOK

IDに紐付くデータが無ければ新規作成、有れば渡されてきたパラメータで更新したいと言うシーンは良くある(はず。自分は良くある)
そのまま何も考えずにやろうとすると、findで取得してnilだったら新規、取得出来れば更新というif文を書く事になるけど、rails先生には便利メソッドが有る。

profile = Profile.find_or_initialize_by(id: 100)

profile.update_attributes({
    name: params[:name]
})

これで望み通りの結果になる。

Active Record クエリインターフェイス

find_or_initialize_byメソッドはfind_or_create_byと同様に動作しますが、createの代りにnewを呼ぶ点が
異なります。つまり、モデルの新しいインスタンスは作成されますが、その時点ではデータベースに保存されていません。

update_attributesの方は…何かdeprecatedになっただの、微妙な記事が引っかかったりするけど、rails5.1.6で使えてるので良しとしよう。

railsやっぱり素敵。

コメント

タイトルとURLをコピーしました