こんにちはてくてーくです。
今回はfind_byメソッドについてまとめたいと思いますので、find_byメソッドについてよく知らない方は参考になれば幸いです。
この記事を書いた目的
Webアプリを作成中にデータベースからオブジェクトを取り出すメソッドはどれが適切かを迷ったためそれぞれのメソッドについて、調べて備忘録として記録します。またこの記事が誰かの役に立てば幸いです。
find_byメソッドとは
はじめにfind_byメソッドとは何なのでしょうか。
find_byメソッドとはデータベースからオブジェクトを取り出すために用いるメソッドの1つです。
データベースからオブジェクトを取り出すメソッドは他にもいくつもありそれぞれにオブジェクトの取り出し方が違っていて、用途によって使いわけることができます。
その他のメソッドについては下のリンクをご覧ください。
find_byメソッドの特徴
find_byメソッドの特徴は以下のとおりです。
- 与えられた条件に合うレコードのうちの最初のレコードのみを返す
- 主キー以外を検索条件に指定できる
- 条件を複数指定できる
- 条件に一致するレコードがない場合nilを返す
順番にみていきましょう。
与えられた条件に合うレコードのうちの最初のレコードのみを返す
find_byメソッドは検索条件に合致したレコード全てを返すのではなく、検索条件に合致したレコードのうちの最初の1つのみを返します。
pry(main)> user = User.find_by(admin: nil)
=>id :2,
name: "Gregory Waelchi",
admin: nil>
上に示したとおり、「admin: nil」 を指定して返ってきたのは1つの最初のレコードのみです。
主キー以外を検索条件に指定できる
find_byメソッドはfindメソッドとは違い主キー(id)以外の条件も検索条件に使うことができます。
下の例はnameを検索条件に指定しています。
pry(main)> user = User.find_by(name: "Gregory Waelchi")
=> id: 2,
name: "Gregory Waelchi"
主キー(id)以外のnameを検索条件に指定することができましたね。
findメソッドで主キー(id)以外を指定できるか
ではfind_byメソッドとよく似たfindメソッドで主キー(id)以外を指定したらどうなるでしょうか。
findメソッドでnameを検索条件にしてやってみましたので以下をご覧ください。
# name: "Gregory Waelchi"を検索
pry(main)> user = User.find(name: "Gregory Waelchi")
ActiveRecord::RecordNotFound: Couldn't find User with 'id'={:name=>"Gregory Waelchi"}
ActiveRecord::RecordNotFound
と表示されてしまいました。
やはりfindメソッドは主キー(id)以外は指定できないようです。
それと比べてfind_byメソッドは主キー(id)以外も指定できることがわかりました。
条件を複数指定できる
find_byメソッドは条件を複数指定できます。以下の例をご覧ください。
# name: "Gregory Waelchi", admin: nil の二つの検索条件を指定
pry(main)> user = User.find_by(name: "Gregory Waelchi", admin: nil)
=> id: 2,
name: "Gregory Waelchi"
上の例ではnameが”Gregory Waelch”でかつadmin属性がnilのオブジェクトを検索しています。
ではどちらか一方の条件だけが適合していた場合はどうなるのでしょうか。
# name: "Gregory Waelchi", admin: true の二つの検索条件を指定
pry(main)> user = User.find_by(name: "Gregory Waelchi", admin: true)
=> nil
上に示したとおり、どちらか一方が条件に適合しているだけでは、nilが返ってきてしまします。
条件に一致するレコードがない場合nilを返す
先ほどの例でも出てきましたが、条件に合わない場合はnilを返します。
findメソッドの場合は例外(エラー)を返していましたがfind_byメソッドの場合はnilを返します。
まとめ
find_byメソッドは主キー(id)以外も検索できるのが便利ですが、1つのレコードしか取得できないということが大きな特徴ですね。
再度find_byメソッドの特徴をリストアップしました。
- 与えられた条件に合うレコードのうちの最初のレコードのみを返す
- 主キー以外を検索条件に使える
- 条件を複数指定できる
- 条件に一致するレコードがない場合nilを返す
find_byメソッドはfindメソッドと一見似ていますが大きく異なるため、違いを理解して正しく使い分けることが必要ですね。
findメソッドについては以前にまとめましたのでこちらをご覧ください。
参考にした記事:
コメント