2012-12-02 51 views
0

我有一個Commentable類繼承自ActiveRecord :: Base和從Commentables繼承的Event類。覆蓋rails活動記錄銷燬has_and_belongs_to_many關係的意外刪除

我已經覆蓋了這兩個類中的destroy方法,並且Event.distroy調用了super。然而,一些意想不到的事情發生具體來說,事件的has_and_belongs_to_many關聯被刪除。我認爲這是因爲一些模塊被包含在Commentables和Event類之間,但不知道是否有辦法阻止它。

這裏的簡化代碼:

class Commentable < ActiveRecord::Base 
    has_many :comments 

    def destroy 
    comments.destroy_all 
    self.deleted = true 
    self.save! 
    end 

end 

class Event < Commentable 
    has_and_belongs_to_many :practitioners, :foreign_key => "commentable_id" 

    def destroy 
    #some Event specific code 
    super 
    end 

end 

我不想從數據庫中刪除的行,只是設置了「已刪除」標誌。我也不想刪除任何關聯。但是,在Event.destroy和Commentable.destroy之間的某處,其他一些rails代碼破壞了has_and_belongs_to_many表中的記錄。

任何想法爲什麼會發生這種情況,以及如何阻止它?

回答

5

您不必在Commentable模型上覆蓋銷燬,只需添加一個before_destroy回調,該回調返回false即可取消銷燬調用。例如:

class Commentable < ActiveRecord::Base 
# ... some code ... 
    before_destroy { |record| 
    comments.destroy_all 
    self.deleted = true 
    self.save! 
    false 
    } 
# ... some code ... 
end 

Event模型同樣如此;只需添加一個回調而不必重寫destroy方法本身。

有關可用回調的更多信息,請參見here

相關問題