Ruby on Rails 3: после метода уничтожения уничтожить объект, если в системе больше нет связанных объектов? - PullRequest
3 голосов
/ 05 апреля 2011

У меня есть небольшая проблема, у меня есть следующие 2 модели:

class CriticalProcess < ActiveRecord::Base



  has_many :authorizations, :dependent => :destroy
  has_many :roles, :through => :authorizations
  after_destroy :check_roles

  def check roles
     cp_roles = self.roles
     cp_roles.each do |role|
       if role.critical_processes.size == 0
          role.destroy
       end
     end
  end
end

и

class Role < ActiveRecord::Base

  has_many :authorizations
  has_many :critical_processes, :through => :authorizations

end

Так что 1 роль может принадлежать многим критическим процессам, есть ли способ, которым яможет ли быть так, что если ALL критические процессы, к которым принадлежала роль, должны были быть уничтожены, то и для этого тоже?Мне это нужно, потому что если все CP (критические процессы), с которыми у ролей были отношения, должны были быть уничтожены, то роль также должна быть уничтожена, поскольку она больше не нужна.

ОБНОВЛЕНИЕ

теперь создал метод after_destroy, который должен удалять роли, но, похоже, он не работает, по какой-то причине после отладки с использованием журналов по какой-то причине он не проходит через массив?

почему это так?

Спасибо

Ответы [ 2 ]

3 голосов
/ 06 апреля 2011

Проблема заключалась в том, что таблица аутентификации удалялась до вызова self.roles, поэтому я изменил after_destroy на before_destroy и сделал еще пару таких изменений:

class CriticalProcess < ActiveRecord::Base

  has_many :authorizations
  has_many :roles, :through => :authorizations
  before_destroy :check_roles

  def check roles
     cp_roles = self.roles
     cp_roles.each do |role|
       if role.critical_processes.size == 1
          role.destroy
       end
       self.authorizations.each {|x| x.destroy}
     end
  end
end

Не самый лучший ответ, но он работает, если у кого-то есть лучший ответ, поделитесь им.

3 голосов
/ 05 апреля 2011

Может быть, вы могли бы определить after_destroy обратный вызов в классе CriticalProcess. Внутри after_destroy вы можете проверить, имеет ли соответствующая Роль нулевые CP, и, если это так, удалить Роль.

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