モデルに記載するscopeとは?

モデルに記載するscope

モデルに記載するscopeと、モデルにメソッドを記載する場合の違いが曖昧だった為、こちらに備忘録として記載します

下記は、モデルにscopeを記載した場合

[app/models ファイル]

scope :title_rails, -> { where(title: "rails") }

# Postモデルからtitleが"rails"というtitleのレコードを取得するメソッド(クラスメソッドを使う場合に利用)
コントローラでPost.title_railsなどのように使う

下記は、モデルにインスタンスメソッドを記載した場合

[app/models ファイル]

  def title_rails?
    self.title == "rails"
  end

# postインスタンスのtitleが"rails"というtitleかを判断するメソッド(インスタンスメソッドとして使う)
コントローラで@post.title_rails?などのように使う

※ポイント
モデルでscopeを使う場合: 毎回同じクラスメソッドの連結処理を記載する場合は、面倒なのでこちらでパターン化(連結しているクラスメソッド部分を分けて記載することも可能)
モデルでインスタンスメソッドを使う場合: コントローラに判別ロジックなどを記載すると可読性などが下がってしまう為、モデルにそのロジックを記載する

参考記事:

Railsのモデルのscopeを理解しよう - Qiita

Railsのscopeの使い方を現役エンジニアが解説【初心者向け】 | TechAcademyマガジン