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

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

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

看起来像这样:

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

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

我有以下定义:

 class Group  :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  :memberships attr_accessible :group_ids # enables mass-assignment end 

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

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

“自动删除连接模型是直接的,没有触发销毁回调” – 来自Ruby Guides。

Hmmmmmm …

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

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

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

谢谢!

在仔细检查了API文档之后 ,事实certificatehas_manyhas_and_belongs_to_many (“ has_and_belongs_to_many ”)只为这种情况提供了一些选项:

  • before_add
  • after_add
  • before_remove
  • after_remove

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

根据我得到的回复数量来判断,这绝不是一个记录良好/使用过的function。

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

我最近遇到了同样的问题并通过扩展关联和覆盖其删除方法来解决它:

 class User < ActiveRecord::Base has_many :memberships has_many :groups, :through => :memberships do def delete(*args) groups = args.flatten # destroy memberships in order to trigger their callbacks: proxy_association.owner.memberships.where(group_id: groups).destroy_all super end end ... end 

作为旁注,看起来我们无法可靠地依赖Rails中的模型回调,这有点令人失望。