.whereメソッドは、指定された条件に合致するレコードを取得するために使用されます。
books = Book.where(author: "山田太郎")
上記の例では、Bookモデルのauthorカラムに値が"山田太郎"に該当するレコードをすべて取得し、books変数に代入しています。
また、.whereメソッドは、次のような特徴があります。
・条件式を引数に取ります。条件式は、以下のように記述されます。
Model.where(条件式)
・条件式には、比較演算子や論理演算子を含めることができます。
以下のような条件式を記述することができます。
Model.where("カラム名 演算子 値")
ここで、Modelはクエリを実行する対象となるモデルのクラス名です。
カラム名は、クエリを実行する対象となるカラムの名前であり、演算子は比較演算子のうちの1つであり、値は比較する値です。
比較演算子には、以下のようなものがあります。
| 演算子 | 意味 |
| —- | —-|
| = | 等しい |
| > | 大きい |
| < | 小さい |
| >= | 以上 |
| <= | 以下 |
| != | 等しくない |
・プレースホルダーを使用することが推奨されています。
条件式に文字列を直接指定することもできますが、ActiveRecordでは、SQLインジェクション攻撃に対処するために、プレースホルダーを使用することを推奨しています。
プレースホルダーを使用する場合、条件式の中に?を記述して、プレースホルダーに対応する値を配列の形で指定します。
・複数の条件を指定することもできます。
複数の条件を指定する場合は、ANDやORを用いて連結します。
また、以下のように、複数の条件をハッシュ形式で指定することもできます。
books = Book.where(author: "山田太郎", published_at: Date.today - 1.week..Date.today)
上記の例では、authorカラムが"山田太郎"であり、かつpublished_atカラムが1週間以内のレコードを取得しています。
なお、.whereメソッドを呼び出した時点では、実際のクエリはまだ実行されておらず、ActiveRecordのリレーションオブジェクトが返されます。
クエリを実行するには、ActiveRecordのリレーションオブジェクトを展開するために、例えば.eachメソッドを呼び出す必要があります。