Ruby on Rails 始めました

Javaやphpはそこそこ書ける程度の人が、Ruby on Railsを一から習得する過程を記したサイト

Rails忘備録

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

find

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

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

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

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

find_by

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

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

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

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

where

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

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

 戻り値はActiveRecord::Relationというオブジェクトです。ActiveRecord::Relationというのは簡単に言えばモデルの配列なのですが、単なる配列ではありません。

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

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

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

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

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

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

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

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

 なので、whereメソッドで取得したデータを出力する際は、必ずeachメソッド等で回す必要があります。

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

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

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

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

all

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

 引数は取りません。

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

使い分け

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

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

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

コメントを残す




関連記事

Pick Up