JavaからのRuby on Rails入門

find、find_by、whereなどモデルを取得する方法まとめ

calendar

reload

スポンサーリンク

find

 findメソッドはテーブルの中からidを指定してモデルを取得したい場合に使います。

 引数に渡せるのはidあるいは、idの配列。

 idを1つだけ指定した場合は戻り値はモデルオブジェクトであるのに対して、idを配列で渡した場合は戻り値は配列(モデルオブジェクトの配列)になるので注意。

 もし指定したidのモデルが存在しなければArgumentError(例外)が投げられるので注意が必要です。

find_by

 find_byメソッドは、条件を指定してモデルを1件だけ取得したい場合に使います。

 引数には連想配列を渡します。

 find_byメソッドで取得できるのは1件のみです。もし条件に合うモデルが複数あった場合は最新の1件が取得されます。

 もし指定したモデルが見つからない場合は戻り値はnilになります。

where

 whereは条件に合うモデルを複数取得したい場合に使います。

 引数には連想配列を渡します。

 戻り値はActiveRecord::Relationというオブジェクトなのですが、まあ単にモデルの配列と思っていたらいいと思います。こういうのはあまり難しく考えない方がRailsのメリットを享受できます。(笑)

 ちなみに条件に合うモデルが1件だけだったとしても戻り値はActiveRecord::Relationになります。要素数が1つの配列みたいなものです。

 難しく考える必要はないのですが、戻り値がActiveRecord::Relationであるおかげで、非常に便利な使い方ができます。チェーンメソッド形式でさらに条件を絞り込むような使い方ができるんです。

 先程の例でもありましたが、こう書いても結果は同じです。↓

 条件に合致したうちの5件だけ取得したい場合にはlimitメソッドを使って以下のように書けます。

 こういったチェーンメソッドを上手く使えば、処理の中でかなり柔軟にクエリを書くことができると思います。

 whereメソッドのもう一つ便利な使い方は、SQL文のwhere句をそのまま引数に渡して使うことができる点です。

 動的なパラメータを指定する時は、?を使ってインジェクション対策をした方がいいです。

 もちろん、この場合も戻り値はActiveRecord::Relationなので、さらにメソッドをつなげて絞り込むことが可能です。

合致しなかった際の戻り値

 whereメソッドを使う場合、条件に合致するモデルが無かった場合の処理には注意が必要です。

 1つも合致するモデルが無かった場合も、戻り値はActiveRecord::Relationオブジェクトになります。言わば中身が空っぽのActiveRecord::Relationオブジェクトです。

 なのでif文の条件に使う際は必ずpresent?メソッドで中身を確かめましょう。

all

 全てのモデルを取得したい場合に使います。

 引数は取りません。

 これは説明するまでもないかと思いますが、とにかく全部欲しい場合はこれです。

使い分け

 findメソッドはもしそのidのモデルが見つからなかった場合(削除されていた等)、いちいち例外を吐いて止まることになるので、個人的には使いません。find_byメソッドの方が使い勝手がいいです。

 モデルを1件だけ取得したい場合はfind_byメソッド。複数取得してeach doで回したい場合はwhereを使うようにしたらいいと思います。

 find_byで取得したオブジェクトをviewでeach doしてしまったら、エラーになるので、each doで出力する時は仮に1件しか要らない場合であっても絶対にwhereを使いましょう。

分からないことはここで質問してみてください↓

この記事をシェアする

コメント

down コメントを残す




関連記事

書いている人

Nobuo

Nobuo

一番かんたんなJava入門というサイトを運営しています。Javaやphpは少し分かりますが、Ruby on Railsについては全く何も知らないので、このサイトにアウトプットしながら覚えていこうかと思っています。 [詳細]

folder Rubyの基本文法

more...

folder 初めてのRuby on Rails入門

more...

folder Rails忘備録

more...

folder 自作のRailsアプリケーション

more...