6
7

【Rails】whereとscopeの苦手意識を克服するためにまとめてみた

Last updated at Posted at 2023-12-21

はじめに

お疲れさまです!
おおくまです!

今回は、Ruby on Railswhereメソッドscopeについてです!

特に理由があるわけではないですが、なんとなく苦手意識がありました。笑
そんな苦手意識を克服するためにまとめてみました!

注意点

内容に誤りがある場合があります!
コメント等で教えていただけると幸甚です!

環境

Ruby 3.2.2
Rails 7.0.6

前提条件

前提条件として、このようなテーブルレコードがあるとします!

whereメソッドとは

Ruby on Railswhereメソッドとは、ActiveRecordを介してデータベースからデータを取得する際に使用されるクエリメソッドの1つです!
このメソッドを使用することで、特定の条件に一致するレコードを取得することができます!


ユーザーを全て取得したい場合は、

@users = User.all

のように取得しますが、
例えば、CountryJPであるUserを取得したい時はどうでしょうか?
そんな時にwhereメソッドを使います!

@japanese_users = User.where(country: 'JP') # => "太郎" "花子"

これでCountryJPであるUserを取得することができます!
今回の場合は、太郎と花子のレコードが取得できます!


では逆に、CountryJPであるUser以外を取得したい時はどうでしょうか?

@not_japanese_users = User.where.not(country: 'JP') # => "Emily" "John" "Steve"

where.notメソッドを使います!
このように書くことで、CountryJPであるUser以外を取得することができます!
今回の場合は、Emily、John、Steveのレコードが取得できます!

scope

Ruby on Railsscopeは、モデルに対するクエリメソッドを定義するための機能です!

scopeを使うと、特定のデータベースクエリモデルに名前付きのメソッドとして簡潔に定義することができます!

これにより、コード可読性と再利用性が向上します!

スコープは基本的にはクラスメソッドと同じようなものですが、以下のような利点があります!


  • チェーン可能
    • スコープはActiveRecord::Relationオブジェクトを返すため、複数のスコープをチェーンすることができる
  • 条件の再利用
    • 同じ条件を複数の場所で再利用する必要がある場合、スコープを定義しておくと、その条件を簡単に再利用できる
  • コードの整理
    • スコープを利用すると、モデルのクエリ条件を1箇所にまとめることができ、コードが整理される
  • nullオブジェクトパターンのサポート
    • スコープは、条件が当てはまらない場合でも常にActiveRecord::Relationを返すため、NoMethodErrorを避けることができる

app/models/user.rb
scope :japannese, -> { where(country: 'JP') }
scope :under_twenty, -> { where('age < ?', 20) }

モデルファイルにこのように書くことで、これらのscopeを使用することができます!

@japanese_users = User.where(country: 'JP') # => "太郎" "花子"

@japanese_users = User.japanese # => "太郎" "花子"

whereメソッドを使用した時と取得できるデータは同じですが、コードがスッキリとしています!
また、同じようにデータを取得する場合でも、繰返し使用することができるので、とても便利です!

また、スコープは組み合わせて使うことができるので、

@japanese_users = User.japanese.under_twenty # => "花子"

このように使うこともできます!

さいごに

本記事が何かのお役に立てれば幸甚です!
最後まで読んでいただきありがとうございました!

6
7
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
6
7