2016-07-28 49 views
1

我有3種型號UserFeatureUserFeature啓動Rails刪除,而不是破壞嵌套屬性

class User < ActiveRecord::Base 
    has_many :user_features 
    has_many :features, through: :user_features 
end 


class Feature < ActiveRecord::Base 
    has_many :user_features 
    has_many :users, through: :user_features 
end 


class UserFeature < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :feature 
end 

我已經創造了在DB的許多功能,以及相關的功能與用戶在用下面的代碼創建用戶

<%= form_for @user do |f| %> 
    // some user_fields 
    <% Feature.all.each do |feature| %> 
    <%= check_box "user[feature_ids][], feature.id %> 
    <% end %> 
    // submit button here 
<% end %> 

在我UserController我有這個代碼

class UserController < ApplicationController 
    def create 
    @user = User.new(permit_params) 
    @user.save 
    end 

    def update 
    @user = User.find(params[:id]) 
    @user.update_attributes(permit_params) 
    end 

    private 
    def permit_params 
     params.require(:user).permit(:name, :email, user_feature_ids: []) 
    end 
end 

當我提交它時,會創建並更新用戶,並在UserFeature表中爲我檢查過的那些功能創建條目。

當如果我未選中任何功能,那麼它將從UserFeature

這裏刪除相關記錄沒有任何問題,一切正常更新用戶。

但是現在我想在user_feature刪除時執行一些活動。

爲此,我在UserFeature after_destroy :some_activity寫了一個回調

class UserFeature < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :feature 

    after_destroy :some_activity 

    def some_activity 
    // some code 
    end 
end 

,但它不工作,當我檢查爲什麼它不叫破壞電話時刪除user_feature,我發現,它會調用一個SQL查詢,而不是調用的destroy未經檢查的user_feature。

這就是爲什麼afterbeforedestroy回調不起作用。

任何人都可以告訴我,在刪除UserFeature時如何執行任何操作?

回答

0

after_destroy回調在delete之後未被觸發,因爲這是delete的實現方式。從docs引用:

活動記錄對象沒有實例化,因此該對象的回調不會執行,包括任何:依賴關聯選項。 [...]注意:雖然通常比替代方法#destroy快得多,但跳過回調可能會繞過應用程序中的業務邏輯,以確保參照完整性或執行其他基本工作。

代替after_destroy回調的關聯類,你可以在關聯定義使用after_remove回調,像Rails Guide about Association Callbacks描述。

+0

是的,我知道刪除將不會運行任何回調,這就是爲什麼我問這個問題。我的問題的解決方案是什麼「我需要在刪除'UserFeature'時執行一些活動? –

+0

我試過這個解決方案,但它只適用於after_add和before_add,仍然不適用於after_remove和before_remove –