デフォルトではそれを行うことはできません。オブジェクトの検査で多くの問題や副作用が発生する可能性があります。inspect
ただし、次のような方法で自分自身を拡張することができます。
class A < ActiveRecord::Base
...
def inspect
[super, bs.inspect].join("\n")
end
end
ただし、インスタンスbs
を検査するたびに強制的にロードされるため、それほど賢くはありません。A
だから多分あなたはもっと賢くなりたいと思うでしょうそしてこのようなことをしたいでしょう:
def inspect
[super, bs.loaded? ? bs.inspect : nil].compact.join("\n")
end
bs
これは、すでにプリロードされているかどうかのみを検査します(:include
たとえば)。
super_inspect
または、すべてを自動的に実行する代わりに作成したい場合もあります。ActiveRecord::Base
次のように拡張できます。
class ActiveRecord::Base
def deep_inspect
([inspect] + self.class.reflect_on_all_associations.map { |a|
self.send(a.name).inspect
}).compact.join("\n ")
end
end
これにより、とのすべての関連付けが自動的に検索されreflect_on_all_associations
、関連付けが読み込まれると、それが呼び出さinspect
れます。
これで、上記のコードを変更できますが、独自のカスタマイズされた検査を作成するか、必要に応じて現在の検査を拡張するだけです。少しのコードで何でも可能です。
少しスマートな更新バージョンの例を次に示します。
class ActiveRecord::Base
def deep_inspect
([inspect] + self.class.reflect_on_all_associations.map { |a|
out = ""
assoc = self.send(a.name)
# Check for collection
if assoc.is_a?(ActiveRecord::Associations::CollectionProxy)
# Include name of collection in output
out += "\n#{assoc.name.pluralize}:\n"
out += self.send(a.name).to_a.inspect
else
out += self.send(a.name).inspect
end
out
}).compact.join("\n ")
end
end