定义一个嵌套的has_many和belongs_to

时间:2019-01-23 19:26:43

标签: ruby-on-rails activerecord rails-activerecord activeadmin rails-models

假设我有3个模型,ABC(其中A有很多B,而B有很多模型C):

class A < ActiveRecord::Base
  has_many :bs
end

class B < ActiveRecord::Base
  belongs_to :a
  has_many :cs
end

class C < ActiveRecord::Base
  belongs_to :b
end

所以这里一切正常。使用A.first.bs,我得到与A的第一个实例关联的B的所有实例,使用C.last.b我得到了与{{1 }}等

但是希望能够做BC,我该怎么做?

我想这样做是因为我希望能够做A.first.cs,因为我想绘制一些关于C.last.a实例的统计信息,这些统计信息按C.all.joins(:a)分组。还有另一种方法可以做到这一点吗?

1 个答案:

答案 0 :(得分:2)

只需创建遍历树的indirect associations

class A < ApplicationRecord
  has_many :bs
  has_many :cs, through: :bs
end

class B < ApplicationRecord
  belongs_to :a
  has_many :cs
end

class C < ApplicationRecord
  belongs_to :b
  has_one :a, through: :b
end

这将使您从任一端出发:

A.first.cs
C.last.a 
# etc

ActiveRecord将自动加入中间模型(B)。