gpt4 book ai didi

ruby-on-rails - Rails 为嵌套属性运行删除而不是销毁

转载 作者:行者123 更新时间:2023-12-05 07:48:26 27 4
gpt4 key购买 nike

我有 3 个模型 UserFeatureUserFeature

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

我已经在数据库中创建了许多功能,并在使用以下代码创建用户时将功能与用户相关联

<%= 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 时不调用 destroy 调用时,我发现它会调用 SQL 查询而不是在未检查的 user_feature 上调用 destroy

这就是为什么 afterbefore destroy 回调不起作用的原因。

谁能告诉我,我如何在删除 UserFeature 的同时执行任何事件?

最佳答案

after_destroy 回调不会在 delete 之后触发,因为这是 delete 的实现方式。引自 docs :

Active Record objects are not instantiated, so the object’s callbacks are not executed, including any :dependent association options. [...] Note: Although it is often much faster than the alternative, #destroy, skipping callbacks might bypass business logic in your application that ensures referential integrity or performs other essential jobs.

您可以在关联定义上使用 after_remove 回调,而不是关联类上的 after_destroy 回调,如 Rails Guide about Association Callbacks 中所述.

关于ruby-on-rails - Rails 为嵌套属性运行删除而不是销毁,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38641892/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com