2012-02-17 59 views
2

我有一個has_many:through模型,完美地工作。Rails:dependent =>摧毀,想調用另一個動作而不是銷燬

has_many :varietals 
    has_many :grapes, :through => :varietals, :dependent => :destroy 

我想調用另一個操作,而不是:destroy。事實上,我不想取消該項目或銷燬它,我想更新記錄狀態字段從1到0,而不是銷燬記錄。

如何調用自定義方法而不是銷燬?我想我可以在模型中做到這一點......謝謝。

把這個方法放在哪裏?在主模型或模型中,記錄將被銷燬?

編輯

我很抱歉,但我覺得我沒有足夠的解釋我的問題。我的問題不僅僅是在主模型被破壞之後如此。即使主記錄沒有被破壞,我也想在Varietal模型本身中自定義destroy操作。

喜歡的東西:

class Varietal < ActiveRecord::Base 

    private 
     def destroy 
     self.update_attributes(:status => 0) 
     end 
end 

其實這個動作是不是叫......

回答

1

的has_many:依賴僅限於幾個選項。按照documentation

:依賴如果設置爲:摧毀所有相關聯的對象通過調用其銷燬方法銷燬 沿着這個對象。如果設置爲 :delete_all將刪除所有關聯的對象,而不調用它們的銷燬方法 。如果設置爲:取消所有關聯對象的外鍵 鍵設置爲NULL而不調用其保存回調。如果設置爲 :限制此對象會引發ActiveRecord :: DeleteRestrictionError 異常,如果它具有任何關聯的對象,則不能將其刪除。

如果使用with:through選項,則連接模型 上的關聯必須爲belongs_to,並且刪除的記錄是連接 記錄,而不是關聯的記錄。

它看起來像你需要改變銷燬方法來更新狀態字段。

+0

我更新了我的第一條消息,並解釋更多...如何更改破壞方法? – 2012-02-17 12:43:03

+0

沒關係,如果你看到我以前的評論(刪除)... Phyo和Shingara有權利。 – ScottJShea 2012-02-17 17:28:34

+0

我很抱歉,但問題不在於我的模型中的關聯。如果我只有一個模型,我不能覆蓋destroy方法來改變它的行爲。這什麼都不做。添加之前或之後的回調不會改變摧毀:該項目將被銷燬。 – 2012-02-17 21:52:07

2

你只需要在before_destroy或after_destroy上添加一個回調並操縱你的關聯。舉例

after_destroy :do_on_grapes 

def do_on_grapes 
    grapes.map(&:to_do) 
end 
7

您可以使用before_destroy將您的自定義邏輯放在那裏。例如,

before_destroy :reset_status 

def reset_status 
    ... 
end 

查看here瞭解更多詳情。

0

我認爲解決您的問題的好方法是提供自定義銷燬方法。有像這些問題提出了一些迴應,但是你應該記住的ActiveRecord和關係,如:

class Image < ActiveRecord::Base 
    has_many :comments, dependent: :destroy 

觸發破壞鏈接到你的關係,也使用回撥機制。通常你應該保留這個機制並將它添加到你的自定義實現中。例如。

def destroy 
    self.update deleted_at: Time.now 
    run_callbacks :destroy 
    end 

你可以看到這篇文章,太: Triggering dependent: :destroy with overridden destroy-method