只是遇到了一个has_many的问题:通过关联和之后/之前-破坏回调没有被触发。
比如说,我有用户、组和一个名为成员的中间关系。我有一个表单,允许用户在选中关联复选框时创建新的成员资格记录,从而注册到组中。基本上是一个group_ids数组。
看起来是这样的:
Which group would you like to join? (check all that apply)
[] Group A
[] Group B
[] Group C我希望记录一些操作,比如加入一个组或将一个组留给活动日志表,并做一些其他不太重要的工作。
我的定义如下:
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方法吗?
任何关于这种情况下的最佳实践的建议都是开放的。
谢谢!
发布于 2010-12-23 00:08:54
仔细研究了API文档之后,has_many和has_and_belongs_to_many ("HABTM")只有几种选择:
before_addafter_addbefore_removeafter_removeclass User < ActiveRecord::Base
has_many :groups, :through => :memberships, :after_remove => :your_custom_method
end从我收到的回复来看,这肯定不是一个很好的文档/使用特性。
只是在这里为我自己和其他可能会像我一样绊倒的人注意到这一点。
发布于 2013-06-06 23:42:12
最近,我一直在努力解决同样的问题,并通过扩展关联和重写其删除方法来解决这个问题:
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发布于 2019-05-28 08:49:14
将dependent: :destroy添加到有很多关系中,实际上调用了Membership类中的before_destroy和after_destroy方法。
class User < ActiveRecord::Base
has_many :groups, through: :memberships, dependent: :destroy
endhttps://stackoverflow.com/questions/4465607
复制相似问题