はじめに
お疲れさまです!
おおくまです!
今回は、Ruby on Rails
のwhereメソッド
とscope
についてです!
特に理由があるわけではないですが、なんとなく苦手意識がありました。笑
そんな苦手意識を克服するためにまとめてみました!
注意点
内容に誤りがある場合があります!
コメント等で教えていただけると幸甚です!
環境
Ruby 3.2.2
Rails 7.0.6
前提条件
前提条件として、このようなテーブル
とレコード
があるとします!
whereメソッドとは
Ruby on Rails
のwhereメソッド
とは、ActiveRecord
を介してデータベース
からデータ
を取得する際に使用されるクエリメソッド
の1つです!
このメソッド
を使用することで、特定の条件に一致するレコード
を取得することができます!
ユーザー
を全て取得したい場合は、
@users = User.all
のように取得しますが、
例えば、Country
がJP
であるUser
を取得したい時はどうでしょうか?
そんな時にwhereメソッド
を使います!
@japanese_users = User.where(country: 'JP') # => "太郎" "花子"
これでCountry
がJP
であるUser
を取得することができます!
今回の場合は、太郎と花子のレコード
が取得できます!
では逆に、Country
がJP
であるUser
以外を取得したい時はどうでしょうか?
@not_japanese_users = User.where.not(country: 'JP') # => "Emily" "John" "Steve"
where.notメソッド
を使います!
このように書くことで、Country
がJP
であるUser
以外を取得することができます!
今回の場合は、Emily、John、Steveのレコード
が取得できます!
scope
Ruby on Rails
のscope
は、モデル
に対するクエリメソッド
を定義するための機能です!
scope
を使うと、特定のデータベースクエリ
をモデル
に名前付きのメソッド
として簡潔に定義することができます!
これにより、コード
の可読性と再利用性が向上します!
スコープ
は基本的にはクラスメソッド
と同じようなものですが、以下のような利点があります!
- チェーン可能
- スコープはActiveRecord::Relationオブジェクトを返すため、複数のスコープをチェーンすることができる
- 条件の再利用
- 同じ条件を複数の場所で再利用する必要がある場合、スコープを定義しておくと、その条件を簡単に再利用できる
- コードの整理
- スコープを利用すると、モデルのクエリ条件を1箇所にまとめることができ、コードが整理される
- nullオブジェクトパターンのサポート
- スコープは、条件が当てはまらない場合でも常にActiveRecord::Relationを返すため、NoMethodErrorを避けることができる
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 # => "花子"
このように使うこともできます!
さいごに
本記事が何かのお役に立てれば幸甚です!
最後まで読んでいただきありがとうございました!