ActiveRecord中的2级深度关系

时间:2016-07-25 03:03:31

标签: ruby-on-rails ruby activerecord

问题

我正在使用rails中的2级深度ActiveRecord类关系。我有三个课程foobarblafoo有很多bar个,bar有一个bla

我所有的关系都是单独运作的,也就是说Foo.find(1).bars.find(1).blas之类的工作正常。问题是,如果给定foo,我想获得与bla的{​​{1}}相关的所有foo的ActiveRecord集。

我尝试过的事情

barsbar合并到一个表中:这显然是一种解决方案,但出于性能原因我将bla规范化了,因为我需要经常调用bla,但很少需要Foo.find(1).bars

bla:此处Foo.find(1).bars.blas方法根本不存在

blas:这是我到目前为止找到的最好的解决方法。但是,映射的结果是一个数组,因此我以后无法将ActiveRecord方法应用于该集合(这是目标)。

2 个答案:

答案 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