2012-07-03 42 views
1

我有两个模型,其中A的has_many B.如果我负荷包括相关联的乙作为这样的对象:检查与各协会

a = A.find(:first, include: :bs) 

a.inspect仅示出了属性:

=> "#<A id: 1, name: \"Test\", created_at: \"2012-07-02 21:50:32\", updated_at: \"2012-07-02 21:50:32\">" 

如何能我做a.inspect,它显示所有相关的a.bs

回答

1

默认情况下不能这样做。这可能会在检查对象时产生太多问题和副作用。但是你可以自己扩展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 

,如果它已经(与:include例如)预装这只会检查bs

或者您可能想创建一个super_inspect,而不是自动执行所有操作。你可以用类似延长ActiveRecord::Base

class ActiveRecord::Base 
    def deep_inspect 
    ([inspect] + self.class.reflect_on_all_associations.map { |a| 
     self.send(a.name).inspect if self.send(a.name).loaded? 
    }).compact.join("\n ") 
    end 
end 

这会自动查找所有关联与reflect_on_all_associations,并且如果关联加载它会调用该inspect

现在,您可以修改上述代码,但是您想要创建自己的自定义检查,或者只需要扩展当前的检查。任何事情都可以用一点代码。