Edited at

scopeとクラスメソッドの違い

More than 3 years have passed since last update.

scopeとクラスメソッドの違いを調べたメモ

scopeは内部実装としてクラスメソッドを動的に生成しているので、基本はどちらを使っても構わないが、一つ覚えておかなければならない違いがある。


scopeは必ずメソッドチェーンできる

class Category < ActiveRecord::Base

scope :hoge, lambda {
nil
}

def self.fuga
nil
end
end

irb(main):001:0> Category.hoge

Category Load (2.4ms) SELECT "categories".* FROM "categories"
=> #<ActiveRecord::Relation [#<Category id: 1, name: "hoge1", created_at: "2015-05-14 12:50:15", updated_at: "2015-05-14 12:50:15">]>

irb(main):002:0> Category.fuga
=> nil

このように、scopeを使うと,スコープ中のクエリがnilを返すときに.all

を返す。よって、メソッドチェーンが必ず可能となる