はじめに
今回は学習中あらためてscope
について調べてみたので、アウトプットの意味も込めて記事にしたいと思います。
どういうときに使用するものなのか、使用しないとどうなるのか等参考になれば幸いです。
スコープとは
- スコープ(scope)は、モデルに対してよく使うクエリを簡潔に記述できる機能です
- スコープを使うことで、複雑なクエリを繰り返し記述することなく、簡単に再利用できるようになります
- つまり、コードの可読性と保守性を向上させるもの
スコープを追加する場所
スコープは通常、モデルクラス内の他のスコープの定義と同じ場所に追加します。
語源は?
- 「scope」の語源はラテン語の「scopus」で、「目的・目標」という意味を持ちます
- 英語では、「scope」は元々「見る」「見通しを持つ」という意味で使われ、その後、特定の範囲や領域を意味するようになりました
- Railsにおいては、「scope」がデータベースクエリの範囲や視点を指す用語として使用されています。つまり、ある条件や視点で見たデータの集合を指定するという意味合いで使われています。
スコープのメリット
-
再利用性
同じクエリロジックを複数箇所で再利用できるため、DRY(Don't Repeat Yourself)原則に従うことができます - 可読性: クエリが短く明確になるため、コードの可読性が向上します
- 保守性: クエリの変更が必要な場合、一箇所を変更するだけで済むため、メンテナンスが容易です
スコープが機能するタイミング
スコープは、モデルクラスに定義され、クエリを発行するときに使用され、以下のようなタイミングで機能します
- コントローラーでのデータ取得: コントローラーでモデルからデータを取得する際にスコープを使用します
- モデル内のメソッド: モデル内のメソッドからスコープを呼び出して、特定の条件に基づくデータを取得します
- メール送信メソッド: 上記のように、メール送信メソッド内でスコープを使ってデータを取得することができます
スコープの使用例
- スコープを使用した場合
# app/models/user.rb
class User < ApplicationRecord
# アクティブなユーザーを定義するスコープ
scope :active, -> { where(active: true) }
end
# コントローラーでの使用例
@active_users = User.active
- スコープを使用しなかった場合
# app/models/user.rb
class User < ApplicationRecord
# スコープを使わない場合の定義
def self.active_users
where(active: true)
end
end
# コントローラーでの使用例
@active_users = User.active_users
スコープを使わない場合、同じ条件を他の場所で再利用する際には、同じ条件をコピーして使う必要があり、コードの重複が生じる可能性があります。それに対して、スコープを使うことで、一度定義すればどこからでも簡単にその条件を適用できるため、保守性や可読性が向上していることがわかります。
さいごに
一貫性を保ちながらも複雑さを管理していくことで素晴らしいモノが完成し、私たちの暮らしの便利を支えるエンジニア。自分でいろいろ調べていくほどすごさが伝わってきます
便利なメソッドとか沢山ありすぎてわからなくならないよう、まずは数個の事例の流れを把握しよう