実務でscopeというものをちゃんと理解していなかったので、記録しておこうとおもいます
モデルのscope
モデルへのメソッド呼び出しとして、よく使われるクエリをまとめたメソッドです。
実際に使い方を見てみましょう
class User < ApplicationRecord
scope :hoge, -> { where(name: 'hoge') }
end
これは、以下のコードと同じです。
User.where(name: 'hoge')
このコードの名前をhogeという名前で使えるんです。つまり、
User.hoge
というメソッドが使えるようになります。
これのメリットは、メソッドが長くなった時可読性が落ちないし、直感的になりますよね
公式化すれば、以下のようになります
class モデル名 < ApplicationRecord
scope :スコープ名, -> { 条件式 }
end
scopeとクラスメソッドの違い
クラスメソッドは、以下のようなコードです
class モデル名 < ApplicationRecord
def self.メソッド名
条件式
end
end
スコープとクラスメソッドはnilを返す時の動きが違います
scopeのときは、返ってくる結果がnilのとき、allメソッドが適用される
クラスメソッドのときは、返ってくる結果がnilのとき、nilが適用される
以上です。何か間違いがございましたら、ご教示いただけますと幸いです。
【参考資料】