通过has_many通过

时间:2019-10-10 21:34:56

标签: ruby-on-rails ruby has-many-through jointable

我呈现了一组复选框,并且想要删除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的不同方法,但是最后一条记录仍然存在。

欢迎任何提示。

谢谢

1 个答案:

答案 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回调,必须在删除特权记录时使用destroydestroy_all方法。

请参见API docs中的要删除还是销毁?

  

对于has_many而言,destroy和destroy_all将始终称为destroy   删除记录的方法,以便运行回调。   但是delete和delete_all要么根据   :depend选项指定的策略,如果没有,则指定:dependent   选项,则它将遵循默认策略。默认值   策略是不执行任何操作(将外键保留为父ID   设置),但has_many:through除外,默认策略为   delete_all(删除联接记录,而不运行它们的回调)。