はじめに
お疲れさまです!
おおくまです!
今回は、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 # => "花子"
このように使うこともできます!
さいごに
本記事が何かのお役に立てれば幸甚です!
最後まで読んでいただきありがとうございました!