こんにちは。てくてーくです。
今回はwhereメソッドについてまとめます。
記事を書いた目的
Webアプリを作成中にデータベースからオブジェクトを取り出すメソッドはどれが適切かを迷ったためそれぞれのメソッドについて、調べて備忘録として記録します。またこの記事が誰かの役に立てば幸いです。
whereメソッドとは
はじめにwhereメソッドとは何なのでしょうか。
whereメソッドとはデータベースからオブジェクトを取り出すために用いるメソッドの1つです。
データベースからオブジェクトを取り出すメソッドは他にもいくつもありそれぞれにオブジェクトの取り出し方が違っていて、用途によって使いわけることができます。
その他のメソッドについては下のリンクをご覧ください。
whereメソッドの特徴
whereメソッドの主な特徴を以下に示しました。
- 与えられた条件にマッチするレコードを全て返す
- NOT、OR、AND条件が使える
順番にみていきましょう。
与えられた条件にマッチするレコードを全て返す
whereメソッドは条件に合うレコードは全て返してくれます。
# admin: nilを検索条件に指定 pry(main)> user = User.where(admin: nil)
=> [#<User:0x00007ff6505475b0 id: 2, name: "Gregory Waelchi", admin: nil>, #<User:0x00007ff650547420 id: 3, name: "Darrell Beahan", admin: nil>, #<User:0x00007ff6505471a0 id: 4, name: "Oran Bosco", admin: nil>]
NOT、OR、AND条件が使える
NOT条件
NOT条件は指定した条件以外のレコードを返してくれます。
#検索条件(Admin: nil)以外のレコードを検索
pry(main)> user = User.where.not(admin: nil)
=> [#<User:0x00007ff6541da1f8
id: 1,
name: "komu",
admin: true>]
#admin: trueのレコードを取得
OR条件
OR条件は二つのリレーションを跨いで検索条件を指定したい場合に使用します。
使用方法は一つ目のリレーションでorメソッドを呼び出し、そのメソッドの引数に2つ目のリレーションを渡すことで実現できます。
#検索条件(name:"komu")または(admin: true)を検索
pry(main)> user = User.where(name: "komu").or(User.where(admin: true))
=> [#<User:0x00007ff65040c060
id: 1,
name: "komu",
admin: true>]
AND条件
AND条件は2つ以上の条件を指定したい場合の使用します。
使用方法はandを使用せずにメソッドチェーンで以下のようにすれば使用できます。
#検索条件(name: "komu")かつ(admin: true)を検索
user = User.where(name: "komu").where(admin: true)
=> [#<User:0x00007faddf9ed7b8
id: 1,
name: "komu",
admin: true>]
上の書き方をもっと簡単にすることもできます。
#検索条件(name: "komu")かつ(admin: true)を検索
# User.where(name: "komu").where(admin: true)と同じ意味
user = User.where(name: "komu", admin: true)
=> [#<User:0x00007faddf9ed7b8
id: 1,
name: "komu",
admin: true>]
まとめ
whereメソッドは条件に適合する全てのオブジェクトを取得できるのでとても便利ですね。
もう一度whereメソッドの特徴を以下に示します。
- 与えられた条件にマッチするレコードを全て返す
- NOT、OR、AND条件が使える
他にもデータベースからオブジェクトを取り出すために用いるメソッドはいくつもあるので用途により使い分けることが肝要です。
findメソッドとfind_byメソッドについてもまとめてありますのでよかったらご覧ください。
参考記事:
【Rails】find・find_by・whereについてまとめてみた
コメント