【Rails】whereメソッドについて

rails

こんにちは。てくてーくです。

今回はwhereメソッドについてまとめます。

記事を書いた目的

Webアプリを作成中にデータベースからオブジェクトを取り出すメソッドはどれが適切かを迷ったためそれぞれのメソッドについて、調べて備忘録として記録します。またこの記事が誰かの役に立てば幸いです。

whereメソッドとは

はじめにwhereメソッドとは何なのでしょうか。

whereメソッドとはデータベースからオブジェクトを取り出すために用いるメソッドの1つです。

データベースからオブジェクトを取り出すメソッドは他にもいくつもありそれぞれにオブジェクトの取り出し方が違っていて、用途によって使いわけることができます。

その他のメソッドについては下のリンクをご覧ください。

Railsガイド

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メソッドについて

【Rails】find_byメソッドについて

 

参考記事:

【Rails】find・find_by・whereについてまとめてみた

Railsガイド

 

コメント