0

我正在开发 Rails 3.0.x 应用程序(实际上是 Hobo 1.3.x,但这对这个问题并不重要)。在模型中,有 GraphPanes、GraphLabels 和 LabelSets。GraphPane 可以有 GraphLabels 和 LabelSet。GraphLabels 可以属于 GraphPanesLabelSet,但不能同时属于两者。因此,如果 GraphLabel 属于 LabelSet,我希望避免将其关联到 GraphPane。

我正在尝试使用 GraphPane 模型中的此代码来强制执行此操作:

has_many :graph_labels, :conditions => 'label_set_id = NULL'

但是,我仍然能够将 GraphLabels 与 not-nulllabel_set_id与 GraphPanes 相关联。为什么?我怎样才能阻止这个?

这个问题表面上很相似,但我的关系不是多态的,所以那里的名义解决方案对我没有帮助。

4

1 回答 1

1

:conditionson的功能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 只能有一个父级,这是您上面的“规范”所要求的。有什么理由不以这种方式实施关系吗?

于 2013-09-10T18:49:27.170 回答