今回の学び
Railsの思想が少しわかった気がした。
背景
Rails(Active Record?)を学んでいた時に、
find(invalid_id)
したら例外が吐かれた。
irb > Building.find(1000000)
Building Load (2.4ms) SELECT `buildings`.* FROM `buildings` WHERE `buildings`.`id` = 1000000 LIMIT 1
Traceback (most recent call last):
1: from (irb):2
ActiveRecord::RecordNotFound (Couldn't find Building with 'id'=1000000)
find_by_id(invalid_id)
をすると nil が返ってきた。
irb > Building.find_by_id(1000000)
Building Load (0.6ms) SELECT `buildings`.* FROM `buildings` WHERE `buildings`.`id` = 1000000 LIMIT 1
=> nil
where(id: invalid_id)
したら 空配列 が返ってきた。
irb > Building.where(id: 1000000)
Building Load (0.6ms) SELECT `buildings`.* FROM `buildings` WHERE `buildings`.`id` = 1000000 LIMIT 11
=> #<ActiveRecord::Relation []>
最初は、わかりにくいなぁ。。。とも思いました。
が、理由を知ってる人に話を聞いたときに腹に落ちたので、
その時の話を残します。
何を聞いたのか
findメソッド
find
は、特定のレコードを取得するためのメソッドなんだ。
指定したIDに欲しい情報が入っていることを知っているから使えるんだ。
あるってわかってて取得したのに、それが無かったから例外になる。
find_byメソッド
find_by
は、条件を指定した検索メソッドなんだ。
検索結果があるかないかは、検索してみないとわからない。
だから、結果がないことは例外ではない。
検索結果が無かったからnilを返す。
whereメソッド
where
は、find_by
と同様に検索メソッドなんだ。
違いは、検索にマッチするすべてのレコードを取得できるということ。
これも、検索結果があるかないかは、検索してみないとわからない。
だから、結果がないことは例外ではない。
検索結果が0件だから、0件の配列を返す。
最後に
なるほど、意味がわかるとわかりやすい。
そして、これはRailsの生みの親であるDHHが言っていたことらしいです。
Railsにおいて彼の言葉は絶対だ。
レールから外れてはいけない。
とも教わりました。