Railsエンジニアとして1ヶ月目の駆け出しエンジニアです。
ActiveRecordのfindに関して気になったことがあったので検証してみました。
背景
前提としてUserクラス内にnameメソッドが定義されていることとします。
user = User.new
user.name
その場合、Userクラスのインスタンスを生成することでインスタンスメソッドのnameを呼び出すことはできますよね?
user = User.find(params[:id])
user.name
対して、ActiveRecordのfindを使用した際は
インスタンスを生成していないのに、何でインスタンスメソッドを呼び出すことができるのか?疑問に思いました・・・
デバッグしてみると
user = User.find(params[:id])
binding.pry
気になったのでbinding.pry
を挟んでみてデバック!
インスタンス化されているのか確認できるようなメソッドがないか調べていると・・・
instance_of?
という便利メソッドを発見しました!
instance_of?メソッドは、レシーバのオブジェクトが引数klassクラスのインスタンスであればtrue、そうでなければfalseを返します。
Rubyリファレンスを読んでみると上記のように記載されており、今の状況にピッタリなメソッドでした。
では早速instace_of?
メソッドを使用して検証!
user.instance_of?(User)
=> true
instance_of?
メソッドを使用することで、引数に指定したクラスのインスタンスなのか確認することができます。
trueが返ってきました!!
結論
instance_of?
メソッドを使用してtrueが返ってきたということは、
userはUserクラスのインスタンスということですね!
ActiveRecordのfindはインスタンスを裏で生成してくれるみたいですね!便利!