【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を返します。