:conditions
on的功能has_many
是过滤通过 传回的结果,而graph_labels
不是保护对象不被添加到关联中。
如果您添加一个没有 label_set_id 的 graph_label,则关联将建立,但如果您随后请求graph_pane.graph_labels
,它将不会返回该非条件匹配的 graph_label。
has_many/belongs_to 关系保存在belongs_to 模型graph_label 上,因此parent/has_many/graph_pane 不会阻止graph_label 将它想要的任何内容写入其graph_pane_id 属性。这种责任分配是正确的,虽然令人沮丧,但我同意。
现在,至于如何阻止这种情况,我不确定。听起来您需要对 graph_label 对象进行某种验证,如果该 graph_label 的 label_set_id 为 nil,则不允许在 graph_label 上设置 graph_pane_id。由于 has_many/belongs_to 关系保存在 graph_label 上,您应该在 graph_label 上编写验证。这样,除非满足条件,否则 graph_label 将无法与新的 graph_panel_id 一起保存。
想法?问题?
参考:
has_many
替代解决方案
我已经重读了你的问题,我认为你想要的是一个多态关联。
def GraphPane < ActiveRecord::Base
has_many :label_sets
has_many :graph_labels, as: :parent
end
def LabelSet < ActiveRecord::Base
belongs_to :graph_pane
has_many :graph_labels, as: :parent
end
def GraphLabel < ActiveRecord::Base
belongs_to :parent, polymorphic: true
end
这样,一个 GraphLabel 只能有一个父级,这是您上面的“规范”所要求的。有什么理由不以这种方式实施关系吗?