Rails has_many-避免重复

时间:2019-04-12 23:27:11

标签: ruby-on-rails ruby activerecord

我在应用程序中嵌套了has_many关系。

我有规则:

class Rule < ApplicationRecord
  has_many :rule_expressions, inverse_of: :rule
  accepts_nested_attributes_for :rule_expressions, allow_destroy: true
end

RuleExpression:

class RuleExpression < ApplicationRecord
  has_many :rule_expression_assignments, inverse_of: :rule_expression
  has_many :assignments, through: :rule_expression_assignments, source: :expressionable
  has_many :assignment_groups, through: :rule_expression_assignments, source: :expressionable
  accepts_nested_attributes_for :rule_expression_assignments, allow_destroy: true
end

RuleExpressionAssignment:

class RuleExpressionAssignment < ApplicationRecord
  belongs_to :rule_expression, inverse_of: :rule_expression_assignments
  belongs_to :expressionable, polymorphic: true
end

分配和分配组非常相似,因此为简单起见,我仅列出其中一个。重要的是它们与RuleExpression处于多态M:M关系:

class Assignment < ApplicationRecord
  has_many :rule_expression_assignments, as: :expressionable, inverse_of: :expressionable
  has_many :rule_expressions, through: :rule_expression_assignments, dependent: :destroy
end

因此您可以看到关系是Rule-> 1:M-> RuleExpression <-M:M-> Assignment。

我的问题是:我需要确保每个Assignment在上下文中对于Rule是唯一的。 Rule绝对不能使用Assignment超过一次。最初,我打算将rule_id添加到RuleAssignmentExpression并基于[rule_id, expressionable_id]创建唯一约束,但是,由于我使用accepts_nested_attributes_for,因此在创建Rule时,Rails处理所有子项的创建,并且我没有将rule_id添加到RuleAssignmentExpression参数中。我应该使用回调before_save,还是有更好的方法实现这一目标?

此数据库使用的是Postgres。

0 个答案:

没有答案