scopeでfind
やfind_by
、first
やlast
メソッドは使うべきではない
user.rb
scope :normal, -> (type) { where(type: type).first }
このようなscopeでnilを返すと、allが適用されてしまい、User.all
が返ってしまう。
これを防ぐためには、scopeでは、ActiveRecord::Relationオブジェクトを返すようにする。
なので、ここでは、first
メソッドを付けずにwhere
メソッドで取得する。
whereメソッドでは対象のデータない場合は、nilは返さず、[]
を返す。
この[]
はActiveRecord::Relationオブジェクト。
user.rb
scope :normal, -> (type) { where(type: type) }
def normal_record(type)
normal(type).first
end
もしくは、scopeの呼び出し先で、first
メソッドを使うのもあり。
normal(type).first