LoginSignup
2

More than 5 years have passed since last update.

ActiveRecordのfindはインスタンスを生成しているか確認してみた。

Posted at

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はインスタンスを裏で生成してくれるみたいですね!便利!

【参考記事】
https://ref.xaio.jp/ruby/classes/object/instance_of

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
2