gpt4 book ai didi

ruby-on-rails - HMT collection_singular_ids=直接删除连接模型,不触发销毁回调

转载 作者:行者123 更新时间:2023-12-02 23:56:05 25 4
gpt4 key购买 nike

刚刚遇到了 has_many :through 关联的问题,并且未触发 after/before-destroy 回调。

假设,我有用户、组和称为成员资格的中间关系。我有一个表单,允许用户在选中关联的复选框时通过创建新的成员记录来注册到组中。基本上是一个 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 不会被触发!

经过谷歌搜索并阅读文档后,我发现了原因:

"Automatic deletion of join models is direct, no destroy callbacks are triggered" - from Ruby Guides.

嗯嗯嗯...

因此,加入模型(在本例中为成员资格)的销毁回调不会被触发。嗯,这是一个令人沮丧的事情。有什么理由吗?

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

欢迎有关此类场景中最佳实践的任何建议。

谢谢!

最佳答案

仔细检查后the API docs ,事实证明 has_manyhas_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

从我收到的回复数量来看,这一定不是一个有很好记录/使用的功能。

只是为了我自己和其他可能像我一样跌倒的人在这里指出这一点。

关于ruby-on-rails - HMT collection_singular_ids=直接删除连接模型,不触发销毁回调,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4465607/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com