Rails 5.1:销毁“has_many:through”与限制关联的记录

我有经典的has_many: through关系:

 class UserGroup < ApplicationRecord has_many :user_groups_users has_many :users, through: :user_groups_users end class UserGroupsUser < ApplicationRecord belongs_to :user_group belongs_to :user end class User < ApplicationRecord has_many :user_groups_users has_many :user_groups, through: :user_groups_users end 

为了销毁UserGroup记录,我需要销毁UserGroup相应记录,这两个记录都是gem的一部分。 否则我会收到错误,即有用户绑定到UserGroups,我无法销毁特定​​的UserGroup

在我的控制器中,我有这个:

  def destroy @user_group = UserGroup.find(params[:id]) UserGroupsUser.where(user_group_id: @user_group).destroy_all respond_to do |format| if @user_group.destroy format.js { flash.now[:notice] = "User group #{@user_group.name} deleted!" } format.html { redirect_to user_groups_url } format.json { head :no_content } else format.js { flash[:danger] = "User group #{@user_group.name} cannot be deleted because #{@user_group.users.size} users belong to it" } end end end 

但是当我单击View中的Delete按钮时,它会在我接受模态窗口之前销毁一条记录。 我怎么做才能destroy行动,请在接受后,请? 正如我所说,它将要求在接受之后,它将through模型然后用户组销毁记录。

我在View中的“删除”操作非常规律:

  

为简化整个过程,您只需向UserGroup添加before_destroy回调即可。 它只会在你运行@user_group.destroy时执行

 class UserGroup < ApplicationRecord has_many :user_groups_users has_many :users, through: :user_groups_users before_destroy do user_groups_users.destroy_all end end 

阅读ActiveRecord回调

只需将has_many :user_groups_users更改为has_many :user_groups_users, :dependent => :destroy

在Association Basics中查看更多信息。

编辑:你说它是一颗gem。 不是问题,仍然! 找到这个类,并在初始化器中添加它(我知道,我知道,有更好的地方,但为了继续这个):

 Whatever::To::UserGroupThing.class_eval do has_many :user_group_users, :dependent => :destroy end 

但是,如果维护人员对这种关联做出某种改变,那么维护可能不是你的朋友。

您还可以在user_group.rb中使用before_destroy挂钩

 before_destroy do UserGroupUser.where(:user_group => self).destroy_all end