我在应用程序中嵌套了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。