2012-08-12 60 views
0

最後的作用,我們有一個非常簡單的組和角色模型如何摧毀模型,但也不允許被刪除

class Group < ActiveRecord::Base 
    has_many :roles, :dependent => :destroy 
end 


class Role < ActiveRecord::Base 
    belongs_to :group 
    after_destroy :ensure_last_role 

    private 
    def ensure_last_role 
    raise "Can't delete last role" if group.roles.count.zero? 
    end 
end 

的after_destroy完美的作品,並且不允許最後一個角色,偶然被破壞。但是這也可以防止這個組在以下情況下被銷燬:dependent =>:destroy試圖銷燬所有角色。當組被破壞或有更好的方法來處理這個問題時,是否有可能不能調用ensure_last_role?

回答

2

經過這一段時間,我找到了一個不使用dependent: :destroy內建的Rails作爲關係的解決方案,因爲我無法按照正確的順序觸發回調。也有一些問題與緩存,所以每次嘗試破壞Role它將使一個小的SQL查詢來看看它的組中的數據庫仍然存在:

> role.destroy 
    Group Exists (0.2ms) SELECT 1 FROM "groups" WHERE "groups"."id" = 18 LIMIT 1 

無論如何,這裏的完整模型代碼:

class Group < ActiveRecord::Base 
    has_many :roles 
    after_destroy :destroy_roles 

    def destroy_roles 
    roles.each { |r| r.destroy } 
    end 
end 

class Role < ActiveRecord::Base 
    belongs_to :group 
    before_destroy :ensure_last_role, if: "Group.exists?(group_id)" 

    private 

    def ensure_last_role 
    raise "Can't delete last role" if group.roles.count == 1 
    end 
end 
+0

其實,我想,這是可能的,這是行不通的,由於'after_destroy'回調被稱爲在最後'Role'的'Group'是不斷破壞之前;如果沒有,我會添加一個替代答案! – 2012-08-12 03:45:21

+0

,不幸的是沒有工作。任何其他想法? – sthapit 2012-08-12 23:18:32

+0

經過一番搗鼓之後,我想我有一個體面的解決方案;我已經更新了答案。 – 2012-08-12 23:53:01

相關問題