ActiveRecord の scope で、引数の値が有効の場合にのみ、その値で条件を指定する以下のようなスコープを考えます
class Hoge < ActiveRecord::Base
# 引数 name に値があれば、その値と name が同一のものでフィルタする
scope :fuga, -> name do
if name.present?
where(name: name)
else
all # Rails3 の場合は all でなく scoped
end
end
end
実は scope の結果として nil や false を返した時は all (Rails3 なら scoped) がそのまま適用されるようになっています。
ゆえに、上記コードのように明示的に all を返す必要はありません。
以下のように else は省略できます。
class Hoge < ActiveRecord::Base
scope :fuga, -> name do
if name.present?
where(name: name)
end
end
end
なお、好みの問題ですがここまで短ければ自分の場合は1行で書く派。
class Hoge < ActiveRecord::Base
scope :fuga, -> name { where(name: name) if name.present? }
end