我有一点问题,我有以下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方法,该方法应该删除角色,但这似乎没有用,出于某种原因,在使用日志进行调试后,由于某些原因它没有循环遍历数组?
为什么会这样?
谢谢
答案 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
不是最简单的答案,但它有效,如果有人有更好的答案,请分享。