Ruby on Rails 3:如果系统中没有更多相关对象,则在destroy方法之后销毁对象?

时间:2011-04-05 00:53:26

标签: ruby-on-rails ruby-on-rails-3

我有一点问题,我有以下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 个答案:

答案 0 :(得分:3)

也许您可以在CriticalProcess类中定义after_destroy callback。在after_destroy内,您可以检查关联的角色是否为零,如果是,则删除角色。

答案 1 :(得分:3)

问题是autherization表在调用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

不是最简单的答案,但它有效,如果有人有更好的答案,请分享。