一分一秒真剣勝負!

Ruby, Railsなど。Web系の技術ネタを充実させたい・・が、そうなるかは分からない。

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') }

のように、アプリの多くの場所から呼びされシンプルな絞り込みの条件だけで使うようにしています。