首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >连接模型的HMT collection_singular_ids=删除是直接的,不触发破坏回调。

连接模型的HMT collection_singular_ids=删除是直接的,不触发破坏回调。
EN

Stack Overflow用户
提问于 2010-12-16 21:38:24
回答 3查看 1.4K关注 0票数 9

只是遇到了一个has_many的问题:通过关联和之后/之前-破坏回调没有被触发。

比如说,我有用户、组和一个名为成员的中间关系。我有一个表单,允许用户在选中关联复选框时创建新的成员资格记录,从而注册到组中。基本上是一个group_ids数组。

看起来是这样的:

代码语言:javascript
运行
复制
Which group would you like to join? (check all that apply)
[] Group A
[] Group B
[] Group C

我希望记录一些操作,比如加入一个组或将一个组留给活动日志表,并做一些其他不太重要的工作。

我的定义如下:

代码语言:javascript
运行
复制
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

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

在谷歌搜索和阅读文档之后,我发现了为什么:

“自动删除连接模型是直接的,不触发任何破坏回调”--来自Ruby。

嗯嗯。

因此,join模型(在本例中是成员资格)的破坏回调不会被触发。那可是令人沮丧的事。有什么原因吗?

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

任何关于这种情况下的最佳实践的建议都是开放的。

谢谢!

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2010-12-23 00:08:54

仔细研究了API文档之后,has_manyhas_and_belongs_to_many ("HABTM")只有几种选择:

  • before_add
  • after_add
  • before_remove
  • after_remove
代码语言:javascript
运行
复制
class User < ActiveRecord::Base
  has_many :groups, :through => :memberships, :after_remove => :your_custom_method
end

从我收到的回复来看,这肯定不是一个很好的文档/使用特性。

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

票数 13
EN

Stack Overflow用户

发布于 2013-06-06 23:42:12

最近,我一直在努力解决同样的问题,并通过扩展关联和重写其删除方法来解决这个问题:

代码语言:javascript
运行
复制
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
票数 0
EN

Stack Overflow用户

发布于 2019-05-28 08:49:14

dependent: :destroy添加到有很多关系中,实际上调用了Membership类中的before_destroyafter_destroy方法。

代码语言:javascript
运行
复制
class User < ActiveRecord::Base
  has_many :groups, through: :memberships, dependent: :destroy
end
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4465607

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档