2012-03-26 61 views
11

我有以下的模型關聯:before_destroy和依賴銷燬不點火

class Slider < ActiveRecord::Base 
    has_one :featured_happening, :as => :featured_item, :dependent => :destroy 
    before_destroy :destroy_featured_happening 
    after_create :create_featured_happening 
end 

class FeaturedHappening < ActiveRecord::Base 
    belongs_to :featured_item, :polymorphic => true 
end 

當我破壞Slider對象我以爲dependent => :destroy會自動銷燬的featured_item但事實並非如此。

滑動控制器

def destroy  
    slider = Slider.find(params[:id]) 
    slider.delete 
    render(:status => :ok, :nothing => true) 
    end 

於是我嘗試了回調與before_destroy手動刪除featured_item當滑塊對象被銷燬,並沒有獲取調用。

如何刪除滑塊對象時刪除featured_item?使用Rails 3.2。

+0

你如何刪除'Slider'實例? – 2012-03-26 03:35:18

+0

def destroy slider = Slider.find(params [:id]) slider.delete render(:status =>:ok,:nothing => true) end – chell 2012-03-26 04:00:53

回答

19

您剛剛觀察到deletedestroy之間的差異。在你的控制器,你叫

slider.delete 

將只執行一個SQL DELETE,但不會調用任何回調。這就是爲什麼在正常情況下你想用destroy代替。它將獲取對象(如果有必要),調用包括遞歸銷燬在內的回調,然後僅從數據庫中刪除該對象。

有關更多信息,請參閱deletedestroy的文檔。

+0

Geez,值得注意。我一直認爲一個是另一個的別名。謝謝。 – 2015-03-01 20:12:10

4

確保您致電​​以觸發回調。 Slider#delete只會刪除記錄而不會調用它們。

0
class Slider < ActiveRecord::Base 
    has_one :featured_happening, :dependent => :destroy 
end 

class FeaturedHappening < ActiveRecord::Base 
    belongs_to :featured_item 
end 

如果你的代碼很簡單,就像上面的簡單關係一樣。然後隨着滑塊的刪除,Feature Happing將隨着滑塊的刪除而被刪除。但在你的情況下,這種關係是多態的。在DB中的功能happing表中,abject_id將是滑塊的ID或可能是其他類。因此,依賴:銷燬不工作。因此,您應該需要使用before_destroy回調來刪除它,其中您首先檢索記錄,然後銷燬它們