Rails has_many - избегать дублирования - PullRequest
0 голосов
/ 13 апреля 2019

У меня есть вложенные отношения 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.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...