gpt4 book ai didi

ruby-on-rails - 从 mixin 添加关联而不覆盖现有关联

转载 作者:太空宇宙 更新时间:2023-11-03 16:02:43 27 4
gpt4 key购买 nike

我有很多类如下:

class Event < ActiveRecord::Base
include PreventUpdate

has_many :participants, conditions: ...
has_many :venues, conditions: ...
has_many :companies, conditions: ...
end

我有一个模块可以处理类的 prevent_update 逻辑(obj 已过去,obj 已被禁止),作为其中的一部分,它查询包含类的 has_many 关联,以便为这些关联编写 before_add Hook 。

module PreventUpdate
extend ::ActiveSupport::Concern

included do
self.reflect_on_all_associations(:has_many).each do |assoc|
has_many assoc.name, before_add: :prevent_update
end
end

def prevent_update
#core prevent update logic
end

end

唯一的问题是动态添加的和原来的has_many语句会互相覆盖。哪个覆盖哪个取决于模块在包含类中的位置。

有什么方法可以使动态添加的声明和原始声明“累积”,即模块的声明可以简单地添加到原始声明上而不被覆盖?

最佳答案

这是未经测试的,但你应该能够做到:

included do 
self.reflect_on_all_associations(:has_many).each do |assoc|
assoc.options.merge!(:before_add => :prevent_update)
end
end

这需要关注点 include 出现在 has_many 声明之后。如果你想在它们之前执行 include,你可以添加:

module ClassMethods
def modify_associations
self.reflect_on_all_associations(:has_many).each do |assoc|
assoc.options.merge!(:before_add => :prevent_update)
end
end
end

然后:

# ...    
has_many :companies, conditions: ...
modify_associations

编辑

这应该有效:

included do 
self.reflect_on_all_associations(:has_many).each do |assoc|
has_many assoc.name, assoc.options.merge(:before_add => :prevent_update)
end
end

关于ruby-on-rails - 从 mixin 添加关联而不覆盖现有关联,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21147603/

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