У меня есть вложенные отношения 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
Назначение и группа назначений очень похожи, поэтому для простоты я перечислю только один.Все, что имеет значение, - это то, что они находятся в полиморфном отношении M: M с RuleExpression:
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
уникален в контексте Rule
.Rule
никогда не следует использовать Assignment
более одного раза.Первоначально я собирался добавить rule_id
к RuleAssignmentExpression
и создать уникальное ограничение на основе [rule_id, expressionable_id]
, однако, поскольку я использую accepts_nested_attributes_for
, когда я создаю Rule
, Rails обрабатывает создание всех дочерних элементов, и янет rule_id
для добавления к RuleAssignmentExpression
параметрам.Должен ли я использовать обратный вызов before_save
, или есть лучший способ добиться этого?
Используемая БД - это Postgres.