问题
我正在使用rails中的2级深度ActiveRecord类关系。我有三个课程foo
,bar
和bla
。 foo
有很多bar
个,bar
有一个bla
我所有的关系都是单独运作的,也就是说Foo.find(1).bars.find(1).blas
之类的工作正常。问题是,如果给定foo
,我想获得与bla
的{{1}}相关的所有foo
的ActiveRecord集。
我尝试过的事情
将bars
和bar
合并到一个表中:这显然是一种解决方案,但出于性能原因我将bla
规范化了,因为我需要经常调用bla
,但很少需要Foo.find(1).bars
。
bla
:此处Foo.find(1).bars.blas
方法根本不存在
blas
:这是我到目前为止找到的最好的解决方法。但是,映射的结果是一个数组,因此我以后无法将ActiveRecord方法应用于该集合(这是目标)。
答案 0 :(得分:2)
您应该使用has_many
选项设置through
。
class Foo < ActiveRecord::Base
has_many :bars
has_many :blas, through: :bars
end
class Bar < ActiveRecord::Base
belongs_to :foo
has_one :bla
end
class Bla < ActiveRecord::Base
belongs_to :bar
end
之后,您可以获得与给定bla
个实例关联的所有Foo
,如下所示:
irb(main):001:0> Foo.last.blas
=> <ActiveRecord::Associations::CollectionProxy [...]
有关详细信息,请参阅Ruby on Rails Guides。
答案 1 :(得分:0)
你可以在Foo中做has_many :blas, :through => :bars
。
http://guides.rubyonrails.org/association_basics.html#the-has-many-through-association