Rails - Попытка перевернуть активный флаг в дочерних ассоциациях

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

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

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

Спасибо


person Chip    schedule 11.10.2011    source источник


Ответы (1)


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

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, это просто ярлык для сопоставления с функцией или переменной для каждого элемента в перечислимом.

person Adam Eberlin    schedule 11.10.2011
comment
Ух ты. Еще раз я сдулся. Спасибо! Это было именно то, что мне было нужно. Кстати, я не уверен, что закрытые форумы никогда не должны открываться снова, но вы правы: приспособиться к этой возможности было легко (я не предполагаю, что все связанные темы должны быть снова открыты, но я рад, что я Я пишу это, так как теперь я понимаю, что мне нужно предотвратить активацию тем внутри закрытого форума (так что еще раз, спасибо!) - person Chip; 11.10.2011