条件式付きのscpoeをクラスメソッドに移行する際に、問題になる
例: scopeの場合
class Item < ApplicationRecord scope :by_name, -> name { where('name like ?', "%#{name}%") if name.present? } end
引数の値が nil
でも、 ActiveRecord::Relation
がキチンと返ってくる
Item.by_name(nil).order(:created_at) #=> ActiveRecord::Relation
例: クラスメソッドの場合
class Item < ApplicationRecord def self.by_name(name) if name.present? where('name like ?', "%#{name}%") end end end
この場合、Item.by_name
に nil
を渡すとエラーが発生する
Item.by_name(nil).order(:created_at) #=> NoMethodError: undefined method `order' for nil:NilClass
どうすればよいの?
nil
の代わりに all
を返せば ActiveRecord::Relation
が返るようになる
def self.by_name(name) if name.present? where('name like ?', "%#{name}%") else all end end
Item.by_name(nil).order(:created_at) #=> ActiveRecord::Relation