HMT collection_singular_ids =删除连接模型是直接的,不会触发销毁回调

Swa*_*rtz 9 activerecord ruby-on-rails has-many-through

刚遇到has_many问题:通过关联和after/before-destroy回调没有被触发.

说,我有用户,组和称为成员资格的中间关系.我有一个表单,允许用户通过在关闭相关复选框时创建新的成员资格记录来注册成组.基本上是一组group_id.

看起来像这样:

Which group would you like to join? (check all that apply)
[] Group A
[] Group B
[] Group C
Run Code Online (Sandbox Code Playgroud)

我希望记录一些操作,例如加入一个小组或将一个小组留在活动日志表中,并做一些其他不太重要的问题.

我有以下定义:

class Group < AR::Base
  has_many :memberships
  has_many :users, :through => :memberships
end

class Membership < AR::Base
  belongs_to :user
  belongs_to :group

  after_create :log_event_to_audit_table
  after_destroy :log_event_to_audit_table

end

class User < ActiveRecord::Base
  has_many :memberships
  has_many :groups, :through => :memberships

  attr_accessible :group_ids   # enables mass-assignment
end
Run Code Online (Sandbox Code Playgroud)

创建新的成员资格记录时,after_create按预期运行.但是,after_destroy不会被触发!

在谷歌阅读并阅读文档后,我发现了原因:

"自动删除连接模型是直接的,没有触发销毁回调" - 来自Ruby Guides.

Hmmmmmm ...

因此,不会触发连接模型(在这种情况下为Membership)的销毁回调.嗯,这是一个下降.有什么理由为什么?

所以我的问题是解决这个问题的最佳方法是什么?我应该在User模型中定义我自己的membership_ed =方法直接调用membership.destroy吗?

对这种情况下的最佳实践提出任何建议.

谢谢!

Swa*_*rtz 11

在仔细检查了API文档之后,事实证明has_many,has_and_belongs_to_many("HABTM")只为这种情况提供了一些选项:

  • before_add
  • after_add
  • before_remove
  • after_remove

class User < ActiveRecord::Base
  has_many :groups, :through => :memberships, :after_remove => :your_custom_method
end
Run Code Online (Sandbox Code Playgroud)

根据我得到的回复数量来判断,这不一定是一个记录良好/使用过的功能.

只是在这里为自己和其他可能像我一样绊倒的人注意到它.

  • 这太疯狂了...非常感谢你。我为此苦苦挣扎了太长时间。 (2认同)