Rails - Попытка поставить активный флаг в детских ассоциациях - PullRequest
0 голосов
/ 11 октября 2011

У меня есть две модели, Форумы и Темы, Форумы много тем.У каждого есть активный логический тип.Когда я переворачиваю активный флаг на форуме, я хочу, чтобы его Темы тоже переворачивали свой флаг.Моя мысль состояла в том, чтобы сделать это в before_save def before_save, если только self.active?self.topics.each {| тема |topic.close} end

В теме я определил метод close: def close self.active = false self.save end

Использую ли я здесь неправильный подход (следует ли делатьв другом месте, как в контроллере?) Я не получаю никаких ошибок, но ничего не происходит, когда я устанавливаю флаг в false (я не хочу переворачивать все темы на активные, когда форум активен, поэтомуМне нужно только это, чтобы пойти в одну сторону).

Спасибо

1 Ответ

0 голосов
/ 11 октября 2011

Нет, у вас правильный подход, вам просто нужно слегка подтолкнуть. Смотрите пример ниже.

class Forum < ActiveRecord::Base
  has_many :topics
  after_save :close_topics!

  def close!
    self.active = false
    self.save!
  end

  private

  def close_topics!
    self.topics.each(&:close!) unless self.active
  end
end

class Topic < ActiveRecord::Base
  belongs_to :forum

  def close!
    self.active = false
    self.save!
  end
end

Вы также можете использовать ActiveRecord Observer . Лично я предпочитаю это фильтру, так как вы больше разделяете свои занятия таким образом. И я склонен любить правильное разделение интересов, поэтому ..

# rails generate observer Forum

class ForumObserver < ActiveRecord::Observer

  def after_save (forum)
    forum.topics.each(&:close!) unless forum.active
  end

end

Я предполагаю, что как только эти записи будут деактивированы, они больше не станут активными. Однако, несмотря на это, код для дополнительной функциональности для обработки противоположного случая незначителен.

P.S. Если вы не знакомы с синтаксисом &:handler, это просто ярлык для отображения функции или переменной для каждого элемента в перечисляемом.

...