2009年7月1日水曜日

[Rails]findメソッドとfind_by_idメソッドの微妙な違い

モデルが参照するテーブルのレコードで、存在しないidものにアクセスしようとすると、その戻り値がfindとfind_by_idで違うことについて。

dataテーブルのidカラムが1~9まで埋まっているものとしよう。
このとき、id = 5のものにアクセスしようとすると、

Data.find(5) # => datasテーブルの5番目のDataモデルインスタンス
Data.find_by_id(5) # => datasテーブルの5番目のDataモデルインスタンス
Data.find(5) == Data.find_by_id(5) # => true


同じものが返ってきます。
一方、id = 10のデータにアクセスしようとすると、そんなインスタンスはなく、

Data.find(10) # => # ActiveRecordNotFound
Data.find_by_id(10) # => nil


返ってくるものが違うんですね!