2012-07-03 3 views
1

у меня есть две модели, где has_many B. Если я загружаю в том числе связанный 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 

Это только инспектировать 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 if self.send(a.name).loaded? 
    }).compact.join("\n ") 
    end 
end 

это будет автоматически искать все ассоциации с reflect_on_all_associations, и если загружена ассоциация он будет вызывать inspect по этому вопросу.

Теперь вы можете изменить приведенный выше код, однако вы хотите создать свой собственный индивидуальный контроль или просто продлить текущий осмотр, если хотите. Все возможно с небольшим количеством кода.

Смежные вопросы