ヨージとプログラミング

プログラミング勉強の記録

【Rails5】Active::Recordが存在しないときにnilを返したい(find_byを使おう)

find(id)では存在しない時はエラーになる

[2] pry(main)> p = Spree::Product.find(0)
  => Spree::Product Load (0.9ms)  SELECT  `spree_products`.* FROM `spree_products` WHERE `spree_products`.`deleted_at` IS NULL AND `spree_products`.`id` = 0 LIMIT 1
ActiveRecord::RecordNotFound: Couldn't find Spree::Product with 'id'=0 [WHERE `spree_products`.`deleted_at` IS NULL]
from /potepanec/vendor/bundle/ruby/2.5.0/gems/activerecord-5.2.1/lib/active_record/relation/finder_methods.rb:346:in `raise_record_not_found_exception!'

(モデルがSpreeなのは無視してください)
この通り存在しないid=0を取得しようとするとNotFoundエラーとなりました。
しかし、エラーではなくnilが欲しいときがあると思います。
例えば、" || "を使って、いくつかの方法で取得を試みる場合。

@user = User.find_by(id: params[:id]) || User.find_by(name: params[:name])

上では最初にidでuserの取得を試みます。そこで取得できなかった場合はnilとなり、次にnameで取得することができます。
ポイントは、idで取得する際に、find(id)ではなくfind_by(id: ...)で取得していることです。find_byの場合、存在しないときはnilを返します。