27
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

存在しないIDでfindしたらErrorになった

Posted at

今回の学び

Railsの思想が少しわかった気がした。

背景

Rails(Active Record?)を学んでいた時に、
find(invalid_id) したら例外が吐かれた。

.ruby
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 が返ってきた。

.ruby
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) したら 空配列 が返ってきた。

.ruby
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において彼の言葉は絶対だ。
レールから外れてはいけない。

とも教わりました。

27
18
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
27
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?