【问题标题】:Delete/Destroy record on join_table with has_many through使用 has_many 删除/销毁 join_table 上的记录
【发布时间】:2020-02-08 09:36:44
【问题描述】:

我渲染了一组复选框,我想删除User 的所有Privilege

  • 当我选中其中一个复选框时,会创建一条记录。
  • 当我取消选中其中一个复选框时,一条记录被删除。

我已经搜索了所有相关的问题,但不幸的是没有一个有效。

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

用户权限

belongs_to :user
belongs_to :privilege

当我想删除(取消选中)该用户在 join_table 中的 last 权限记录时,问题就出现了。

记录仍然存在,无法删除/销毁该特定记录。

我对回调的直觉回忆,我尝试了不同的使用方式dependent,但最后一条记录仍然存在。

欢迎任何提示。

谢谢

【问题讨论】:

  • 使用dependant: :destroy 或向外键添加级联触发器都将删除孤立记录。但是您问的是某种复选框,这意味着涉及更多移动部件,问题甚至可能不在模型层上。
  • 你的问题解决了吗?
  • @demir 还没有时间测试它。希望今天能成功
  • 原来这是一个与复选框以及我们如何呈现它们有关的问题。所以我认为你的回答是正确的,但不适用于我的情况。我留在这里以备将来使用checkboxeshas_and_belongs_to_many 的链接。 sitepoint.com/save-multiple-checkbox-values-database-rails

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


【解决方案1】:

如果要从连接表中删除记录,需要将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 将根据 :dependent 选项指定的策略,如果没有 :dependent 给出选项,那么它将遵循默认策略。默认 策略是什么都不做(将外键保留为父 ID set),除了 has_many :through,默认策略是 delete_all(删除连接记录,不运行它们的回调)。

【讨论】:

  • 原来这是一个与复选框以及我们如何呈现它们有关的问题。所以我认为你的回答是正确的,但不适用于我的情况。我留在这里以备将来使用checkboxeshas_and_belongs_to_many 的链接。 sitepoint.com/save-multiple-checkbox-values-database-rails
猜你喜欢
  • 1970-01-01
  • 2010-10-20
  • 2015-06-01
  • 2011-09-27
  • 1970-01-01
  • 1970-01-01
  • 2017-04-18
  • 1970-01-01
  • 2014-01-22
相关资源
最近更新 更多