find と find_by_ の使い分け
タイトルのメソッドを使い分けるポイントを忘れがちなのでエントリとして残しておく。
find と find_by_ の振る舞いで異なる点は以下のとおり。
検索で複数件がヒットする場合、find では複数結果を配列で返すが、find_by_ は1件のみ返す
検索で1件もヒットしなかった場合、find は RecordNotFound となるが、find_by_ は nil を返す
実際に試してみるとよくわかる。
まずは find の場合。script/console で試す。
User.find 10
User Columns (1.2ms) SHOW FIELDS FROM `users`
User Load (0.4ms) SELECT * FROM `users` WHERE (`users`.`id` = 10) AND (`users`.`status` IN ('ACTIVE','RETIRED'))
ActiveRecord::RecordNotFound: Couldn't find User with ID=10
続いて find_by_ の場合。
# User.find_by_id 10
User Load (0.7ms) SELECT * FROM `users` WHERE (`users`.`id` = 10) AND (`users`.`status` IN ('ACTIVE','RETIRED')) LIMIT 1
=> nil
発行しているSQLを見ると LIMIT 1 が付いているので必ず1件を返すことがわかるし、ヒットしなかったら確かに nil が返ってくる。
常日頃から、細かい違いをきちんと把握しておくことが大切だよね。