hello-world
webエンジニアのメモ。とりあえずやってみる。

[Rails]find_or_create_byとfind_or_initialize_by

公開日時

Rails4で確認。

オブジェクトが存在する場合は取得、なければ作成、ということがしたい場合にfind_or_create_byが使うと便利です。

user = User.find_or_create_by(uid: 'sample') # uid = 'sample' のユーザが存在する場合は取得、しなければ新規保存

ですが、find_or_create_byだと新規作成の場合のみ特定の処理をさせたい、といった場合にnew_recordなのかどうか区別がつきません。

その場合は、find_or_create_byではなくfind_or_initialize_byを使います。

user = User.find_or_initialize_by(uid: 'sample') # uid = 'sample' のユーザが存在する場合は取得、しなければ新規作成(未保存)
if user.new_record? # 新規作成の場合は保存
  user.save!
  # 新規作成時に行いたい処理を記述
end

new_record?を使うと新規作成かどうかが区別できるので、新規作成時のみ特定の処理を行うことが可能になります。

参考


Related #Rails

[rails]ELB使用時にヘルスチェック用のアクションを作成する

ELBにrailsアプリをぶら下げる場合、railsアプリが落ちたらELBから外れてもらいたいです。

[rails]carrierwaveで保存した画像のurlを取得する

carrierwave 0.10.0 で確認 imageカラムにcarrierwaveで保存した画像を保存している場合、デフォルトのままだとだとurlメソッドを実行してもpublic以下のパスのみで http://~ が設定されていません。