【问题标题】:Is there any way to access STI table through two has_many association?有没有办法通过两个 has_many 关联访问 STI 表?
【发布时间】:2017-08-07 19:28:35
【问题描述】:

当我在 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

但出于某种原因(可预测性、分配参数等),我更喜欢关联。 那么有谁知道如何设置关联定义,或者这不可能吗?

【问题讨论】:

    标签: ruby-on-rails ruby activerecord


    【解决方案1】:

    如果您的男性/女性孩子没有不同的行为,那么这不应该通过 STI 来完成,而应该只使用属性。考虑到孩子通常有两个父母这一事实,这种模型也不足。

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

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

    但是因为这不能回答你的问题:

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

    应该可以。

    【讨论】:

    • 在实际代码中,类不是男/女孩子。我试图通过父母/孩子的关系来解释我的麻烦。由于实际代码中的子类具有不同的行为,如果您假设男性/女性儿童类具有不同的行为,我很高兴。
    猜你喜欢
    • 1970-01-01
    • 2014-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-12-04
    • 2011-07-28
    相关资源
    最近更新 更多