2011-10-02 54 views
-1

我想弄清楚如何在保存回調後告訴數組中有什麼變化。下面是我使用的代碼示例:確定在Rails after_save回調中從數組中刪除了哪些id?

class User < ActiveRecord::Base 
    has_many :user_maps, :dependent => :destroy 
    has_many :subusers, :through => :user_maps, :dependent => :destroy 

    has_many :inverse_user_maps, :class_name => "UserMap", :foreign_key => "subuser_id" 
    has_one :parent, :through => :inverse_user_maps, :source => :user 

    after_save :remove_subusers 

    def remove_subusers 
    if self.subuser_ids_were != self.subuser_ids 
     leftover = self.subuser_ids_were - self.subuser_ids 

     leftover.each do |subuser| 
     subuser.destroy 
     end 
    end 
    end 
end 

class UserMap < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :subuser, :class_name => "User" 
end 

我與after_save的回調去除subusers因爲我無法獲得相關的破壞功能通過user_maps工作。有沒有人有辦法做到這一點?

謝謝!

+0

顯示您的子用戶模型 –

+0

沒有子用戶模型。這是一種自我參照關係。 – NineBlindEyes

回答

0

雖然沒有嚴格的回答你的問題,我想你也許能得到:依賴=>:摧毀如果您嘗試以下的工作...

class User < ActiveRecord::Base 
    has_many :user_maps, :dependent => :destroy 
    has_many :subusers, :through => :user_maps # removing the :dependent => :destroy option 
end 

class UserMap < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :subuser, :class_name => "User", :dependent => :destroy # add it here 
end 

通過移動:依賴=>:在UserMap模型的belongs_to關聯中銷燬選項,通過UserMap#destroy方法設置級聯刪除。換句話說,調用User#destroy將爲每個UserMap記錄調用UserMap#destroy,然後調用sub_user.destroy獲取其sub_user記錄。

編輯

由於上述解決方案沒有工作,我的下一個建議是一個回調添加到user_maps關聯,然而這附帶了我的後面添加一個警告

class User < ActiveRecord::Base 
    has_many :user_maps, :dependent => :destroy, :before_remove => :remove_associated_subuser 

    def remove_associated_subuser(user_map) 
    user_map.subuser.destroy 
    end 
end 

警告

1)使用before_remove回調將意味着user_map.destroy功能將不會被調用,如果有一個錯誤與回調

2)你將不得不使用方法上的用戶類,例如摧毀你的用戶映射記錄......

# this will fire the callback 
u = User.first 
u.user_maps.destroy(u.user_maps.first) 

# this WONT fire the callback 
UserMap.first.destroy 

所有的事情考慮,這將讓我緊張。我首先會嘗試修改代碼以使關聯與同一個表相關聯,因此:dependent =>:destroy選項可以工作,如果不能這樣做,請將級聯刪除約束添加到數據庫,至少你的關聯將永遠被刪除,無論你在哪裏/如何在你的Rails應用程序中銷燬它。

+0

感謝您的幫助。我試了一下,ID沒有工作,但我想知道是否因爲我有更多的代碼,然後我顯示引用的子用戶。我無法顯示我所有的代碼,因爲我有數百行代碼,但是我會添加其他與逆用戶關係有關的代碼行。 – NineBlindEyes

+0

嗨,我已經添加了一些我希望可以幫助你的更多信息。 – roboles

0

可以使用骯髒的模塊訪問器http://ar.rubyonrails.org/classes/ActiveRecord/Dirty.htmlDetermine what attributes were changed in Rails after_save callback?

建議你的情況,你有after_save將有機會獲得subusers_change這是兩個元素的數組,第一個是前值和第二個是處理程序新的價值。

+0

我嘗試使用subusers_change。它說這是一個未定義的方法。我也嘗試了subuser_ids_change並且有相同的消息。 – NineBlindEyes

相關問題