1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

scopeとクラスメソッド

Posted at

実務で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が適用される

以上です。何か間違いがございましたら、ご教示いただけますと幸いです。

【参考資料】

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?