我呈现了一组复选框,并且想要删除Privilege
中的所有User
。
我已经搜索了所有相关问题,但不幸的是,没有一个有效的问题。
Rails 5.2.3
用户
has_many :user_privileges, class_name: 'UserPrivileges'
has_many :privileges, through: :user_privileges
特权
has_many :user_privileges, class_name: 'UserPrivileges'
has_many :users, through: :user_privileges
UserPrivileges
belongs_to :user
belongs_to :privilege
当我想删除(取消选中) join_table 中该用户的最后特权记录时,问题就出现了。
记录仍然存在,无法删除/销毁该特定记录。
我对回调的直观回忆,我尝试了使用dependent
的不同方法,但是最后一条记录仍然存在。
欢迎任何提示。
谢谢
答案 0 :(得分:0)
如果要从联接表中删除记录,则需要将dependent: :destroy
添加到has_many :through
关系中。
# privilege.rb
has_many :user_privileges, class_name: 'UserPrivileges'
has_many :users, through: :user_privileges, dependent: :destroy
请参见API docs中的删除了哪些内容?:
这里有一个潜在的陷阱:has_and_belongs_to_many和 has_many:通过关联在联接表中以及在表中都有记录 相关记录。因此,当我们调用这些删除方法之一时, 究竟应该删除什么?
答案是,假定关联上的删除是 关于删除所有者与关联对象之间的链接 对象,而不一定是关联的对象本身。 因此,通过has_and_belongs_to_many和has_many:through,加入 记录将被删除,但关联的记录不会被删除。
要运行dependent: :destroy
回调,必须在删除特权记录时使用destroy
或destroy_all
方法。
请参见API docs中的要删除还是销毁?:
对于has_many而言,destroy和destroy_all将始终称为destroy 删除记录的方法,以便运行回调。 但是delete和delete_all要么根据 :depend选项指定的策略,如果没有,则指定:dependent 选项,则它将遵循默认策略。默认值 策略是不执行任何操作(将外键保留为父ID 设置),但has_many:through除外,默认策略为 delete_all(删除联接记录,而不运行它们的回调)。