2

我試圖防止從數據庫中刪除模型,並且幾乎遵循這個guide(請參閱9.2.5.3在before_destroy中練習你的偏執狂)。Rails before_destroy回調數據庫變化總是回滾

我有一個簡單的模型:

class User < ActiveRecord::Base 
    before_destroy do 
    update_attribute(:deleted_at, Time.current) 
    false 
    end 

,並在控制器:

def destroy 
    @user = User.find(params[:id]) 
    # @user.update!(deleted_at: Time.zone.now) # if I do it here it works 
    @user.destroy # if I also comment this line... 

    render :show 
end 

回調函數被調用和屬性被設置,但隨後的數據庫事務總是被回滾。我遺漏了返回的false模型被刪除,因爲刪除的執行沒有停止。

正如你可以在評論中看到的,我可以使它工作,但是我真正想要做的是使用服務對象並將邏輯放在控制器之外。

回答

1

如果您的回調返回false,則該事務將始終回滾。

對於你想要的,你不應該調用你的arel對象上的destroy方法。
相反,使自己的方法,如soft_destroy或類似的東西,並更新您的屬性。

爲了防止他人在您的arel對象上調用destroy方法,只需添加一個回調引發和異常。

+0

我猜想* false *是原因。感謝您的確認。奇怪的是,這是在一本書中提出的。我會走你提出的路線。謝謝。 – einSelbst 2014-11-04 20:47:19

0

您的模型只是一個對象。如果你真的想改變銷燬的概念,請改變它:

def destroy 
    condition ? alt_action : super 
end