読者です 読者をやめる 読者になる 読者になる

一分一秒真剣勝負!

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

ActiveRecordで引数があるscopeはクラスメソッドで定義しろ

tech rails

タイトルの通りで、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') }

のように、絞り込みの条件だけで使うようにしている。