Обновление связанного родителя без бесконечного цикла обратного вызова - PullRequest
2 голосов
/ 17 января 2012

У меня есть три модели: Скидка, Флаг и Пометка.

# Discount.rb
has_many :flaggings, :uniq
has_many :flags, through: :flaggings,
         before_add: :update_flags,
         before_remove: :update_flags

before_validation :unpublish_when_ended, if: :ended_changed?

def update_flags(flag)
  flag.discounts_count = flag.discounts.count
  self.published = self.flags.include?(Flag.published)
end

def unpublish_when_ended
  if self.ended?
    self.flags.delete(Flag.published)
  end
end

То, чего я хочу добиться, - это добавить опубликованный флаг к скидке (discount << Flag.published), и это обновит столбец published скидки до true. Также существует обратный вызов, поэтому после окончания скидки опубликованный флаг будет удален.

Однако с указанным кодом опубликованный столбец не сохраняется.

Я не могу вызвать discount.save в обратном вызове update_flags, потому что переполнение стека / бесконечные циклы обратного вызова произойдут, когда обратный вызов unpublish_when_ended продолжит вызывать сам себя.

Есть ли способ решить это? Спасибо!

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