2016-07-28 62 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 –