默认情况下你不能这样做。它可能会在检查对象时产生太多问题和副作用。不过你可以延长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 http://api.rubyonrails.org/classes/ActiveRecord/Reflection/ClassMethods.html#method-i-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