ruby-on-rails - 在不覆盖现有关联的情况下添加来自mixin的关联

  显示原文与译文双语对照的内容

我有许多类,如下所示:


class Event <ActiveRecord::Base
 include PreventUpdate

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

为了处理类的问题,我有一个处理类逻辑( obj在过去,obj被禁止)的模块,并且作为它的一部分查询包含类的包含类。


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

这就要求 includehas_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

...