2017-08-07 86 views
0

当我在has_many关系中使用STI时,我想通过超类的关联来访问子对象,但在坚持之前我无法做到。有没有办法通过两个has_many关联来访问STI表?

这些是与我的情况类似的示例代码。

class Parent < ActiveRecord::Base 
    has_many :children, class_name: 'Child', inverse_of: :parent 
    has_many :male_children, class_name: 'Children::Male' 
    has_many :female_children, class_name: 'Children::Female' 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent, inverse_of: :children 
end 

class Children::Male < Child 
end 

class Children::Female < Child 
end 

当我将has_many关联设置为子类的关联时,我无法通过超类关联进行访问。

parent = Parent.new 
parent.male_children << Children::Male.new 
parent.female_children << Children::Female.new 

parent.children # => [] 

保存并重新加载父节点后,当然我可以从数据库中获取超类的子关联作为ActiveRecord提取。

parent.save 
parent.reolad 
parent.children # => [#<Children::Male ...>, #<Children::Female ...>] 

我可以通过实现这样

class Parent < ActiveRecord::Base 
    ... 
    def children 
    [male_children, female_children].flatten 
    end 
end 

实例方法解决这个问题,但我更喜欢联想出于某种原因(可预见性,分配参数,可以等)。 那么有谁知道如何设置关联定义,或者这是不可能的?

回答

0

如果你的男性/女性的孩子没有不同的行为,那么这不应该通过性传播感染,但只使用属性。当考虑到儿童通常有两个父母这一事实时,这种模型也不足。

当你有性别属性,你可以这样做:

parent.children.where(sex: 'male') 

但由于这不回答你的问题:

parent.male_children.build(name: 'Carl') 

应该工作。

+0

在实际的代码中,班级不是男性/女性的孩子。我试图通过家长/孩子的关系来解释我的麻烦。 而作为实际代码中的子类有不同的行为,我很高兴如果你认为男性/女性的孩子有不同的行为。 – tacamula

相关问题