ActiveRecordで引数があるscopeはクラスメソッドで定義しろ!
タイトルの通りActiveRecordでscopeを使う場合、引数が必要であればクラスメソッドを使うことがRails Guideで推奨されている。 これを知ったのはかなり前のことで、その時から自分は引数を受け取るscopeをクラスメソッドとして定義しています。
class Article < ActiveRecord::Base def self.created_before(time) where("created_at < ?", time) end end
Using a class method is the preferred way to accept arguments for scopes. These methods will still be accessible on the association objects:
category.articles.created_before(time)
Active Record Query Interface — Ruby on Rails Guides
推奨されているだけであって、別にscopeを使いたければ使ってもいいのだけど、今となってはnamed_scopeを使えば遅延評価が便利〜。とかクラスメソッドでも同じような(厳密には違うけど)ものだし、自分の場合scopeで定義するのは
# 編集可能な記事 scope :editable, -> { where(state: 'editable') }
のように、アプリの多くの場所から呼びされシンプルな絞り込みの条件だけで使うようにしています。