Rails | 初心者向けのscopeの使い方

Railsには、Active Recordクラスであるモデルに対して簡単にクエリを作成できるためのメソッドがあります。このメソッドの一つが「scope」です。

scopeを使用すると、複数のクエリで共通して使用される条件を簡単に定義できます。これにより、コードの重複を避け、簡潔で保守しやすいコードを書くことができます。

例えば、以下のようなUserモデルがあるとします。

Ruby

class User < ApplicationRecord
  scope :active, -> { where(status: :active) }
end

この例では、このスコープは、Userモデルに対して、statusが「active」であるユーザーを取得するものです。

activeスコープの定義では、ブロックを使用して、where句を簡潔に記述しています。これにより、コードがシンプルで読みやすくなっています。スコープを使用することで、同じ条件でクエリを書く必要がある場合に、重複を避けることができます。

上記の例で定義したactiveスコープを呼び出す場合は、以下のように書きます。

Ruby
User.active

このようにすることで、Userモデルからstatusが「active」であるユーザーのみを取得することができます。

スコープは、単純なActiveRecordのクエリの再利用を可能にし、コードの再利用性を向上させます。また、可読性の高いコードを書くことができます。

スコープはどこで定義するの? どこで使用するの?

スコープは、モデルとコントローラーで定義できます。

モデルでスコープを定義することが一般的ですが、必要に応じてコントローラーでもスコープを定義することができます。

スコープの使用は、モデル、コントローラー、ビューのどこでも可能です。

ただし、ビューで複雑なクエリを実行するためのものではありません。ビューで必要となるデータをできるだけ限定し、ビジネスロジックはモデルに置くように心がけるべきです。

関連するモデルにも定義できる

関連するモデルにもスコープを定義することができます。

関連するモデルに対してスコープを定義することで、より簡潔なクエリを書くことができます。以下に例を示します。

Ruby
class User < ApplicationRecord
  has_many :posts
end

class Post < ApplicationRecord
  scope :published, -> { where(published: true) }
  belongs_to :user
end

上記の例では、UserモデルとPostモデルが関連付けられています。

Postモデルには、publishedスコープが定義されています。

このスコープは、publishedカラムがtrueであるPostモデルのみを取得するものです。

Userモデルから、関連するPostモデルに対してpublishedスコープを適用する場合は、以下のように書くことができます。

Ruby
user = User.find(1)
user.posts.published

このようにすることで、関連するPostモデルから、publishedカラムがtrueであるもののみを取得することができます。

スコープを関連するモデルに定義することで、簡潔なコードを書くことができ、可読性が向上します。

スコープで引数を取る

スコープは引数を取ることができます。引数を使うことで、動的なクエリを書くことができます。例えば、特定の条件に応じて異なる結果を返すスコープを定義することができます。

以下に例を示します。

Ruby
class Post < ApplicationRecord
  scope :published, -> { where(published: true) }
  scope :created_after, -> (date) { where("created_at > ?", date) }
end

上記の例では、Postモデルに2つのスコープが定義されています。

publishedスコープは、publishedカラムがtrueであるPostモデルのみを取得します。

created_afterスコープは、引数として渡された日付以降に作成されたPostモデルを取得します。

以下のように、引数を渡してスコープを呼び出すことができます。

Ruby
Post.published # publishedカラムがtrueであるPostモデルを取得

Post.created_after(Date.today - 1.week) # 1週間前以降に作成されたPostモデルを取得

このようにすることで、動的なクエリを簡単に書くことができます。

引数を使うことで、異なる条件に対して簡単にスコープを定義することができ、コードの可読性が向上します。

まとめ

今回はRailsでスコープを定義するためのいくつかの方法を紹介しました。

スコープを使用することで、コードの重複を避け、複雑なクエリをシンプルにすることができます。ぜひ、活用してみてください!