Rails | whereメソッドの使い方と基本的なクエリの書き方

「whereメソッド」とは、RailsのActive Recordクラスであるモデルに対して簡単にクエリを作成できるためのメソッドの1つです。本記事では、初心者向けにwhereメソッドの基本的な使い方について解説します。

whereメソッドとは

whereメソッドは、指定した条件に合致するレコードを取得するためのメソッドです。引数にはハッシュ形式で条件を指定します。

以下に、例としてUserモデルから年齢が20歳のユーザーを取得するコードを示します。

Ruby
@users = User.where(age: 20)

このようにすることで、ageが20のユーザーを取得することができます。複数の条件を指定する場合には、複数のキー・バリューの組み合わせで指定します。

Ruby
@users = User.where(age: 20, gender: 'male')

この場合、ageが20かつgenderがmaleであるユーザーを取得します。

演算子の指定

whereメソッドでは、指定した条件をORでつなぐ場合や、比較演算子を使用する場合もあります。その場合は、ハッシュの値にハッシュを渡すことで指定します。

例えば、以下のコードはageが20または30のユーザーを取得するコードです。

Ruby
@users = User.where(age: [20, 30])

また、以下のコードはageが20以上のユーザーを取得するコードです。

Ruby
@users = User.where('age >= ?', 20)

ここでは、?を使用して、SQLインジェクションを防ぎつつ変数を埋め込んでいます。

結果の取得

whereメソッドで取得した結果は、Active Recordオブジェクトの配列として返されます。例えば、以下のコードは、Userモデルのnameが”John”のユーザーが存在するかどうかを判定するコードです。

Ruby
@user = User.where(name: 'John').first
if @user.present? # Johnが存在する場合の処理
else # Johnが存在しない場合の処理
end

また、Active Recordオブジェクトの配列から必要な情報を取り出す場合には、eachメソッドやeach_with_indexメソッドを使用します。

Ruby
@users = User.where(age: 20)
@users.each do |user| puts user.name
end

whereメソッドのオプション

whereメソッドには、いくつかのオプションがあります。

条件の論理演算子

whereメソッドでは、条件を複数指定することができます。指定した複数の条件は、AND条件で結合されます。

Ruby
User.where(name: "John", age: 25)

上記の例では、nameが”John”かつageが25のユーザーを検索します。

また、OR条件で複数の条件を指定することもできます。この場合は、whereメソッドを複数回呼び出すか、arelを使用する必要があります。

Ruby
User.where(name: "John").or(User.where(age: 25))

上記の例では、nameが”John”またはageが25のユーザーを検索します。

比較演算子

whereメソッドでは、以下のような比較演算子を使うことができます。

Ruby
User.where("age > ?", 25)

上記の例では、ageが25よりも大きいユーザーを検索します。

Ruby
User.where("created_at < ?", Time.now - 1.day)

上記の例では、created_atが1日前よりも古いユーザーを検索します。

IN句

whereメソッドでは、IN句を使うことができます。

Ruby
User.where(id: [1, 2, 3])

上記の例では、idが1、2、3のユーザーを検索します。

NOT句

whereメソッドでは、NOT句を使うことができます。

Ruby
User.where.not(name: "John")

上記の例では、nameが”John”ではないユーザーを検索します。

まとめ

whereメソッドは、Active Recordクラスであるモデルに対して簡単にクエリを作成できるためのメソッドです。複数の条件を指定することができ、比較演算子やIN句、NOT句を使うことができます。ぜひ活用してみてください