在开发中,我试图通过在ActiveRecord::Base
类中包含一个方法来收集我的应用程序中的所有模型,以便他们可以配置模型,它会给我一个钩子来将该模型添加到全局数组中。
module EngineName
module ActiveRecordExtensions
extend ActiveSupport::Concern
included do
def self.inherited(klass) #:nodoc:
klass.class_eval do
def self.config_block(&block)
abstract_model = EngineName::AbstractModel.new(self)
abstract_model.instance_eval(&block) if block
EngineName::Models.add(abstract_model)
end
end
end
end
end
end
我的EngineName::Models
课程只是一个包含所有模型的包装器。
module EngineName
class Models
class << self
def all
@models ||= []
end
alias_method :models, :all
def navigation
@models - excluded_navigation_models
end
def routed
@models - excluded_route_models
end
# Creates an array of models if none exists. Appends new models
# if the instance variable already exists.
def register(klass)
if @models.nil?
@models = [klass]
else
@models << klass unless @models.include?(klass) || excluded_models.include?(klass)
end
end
alias_method :add, :register
end
end
end
但是,在每次刷新时,config_block
我的模型中的方法都会被调用,然后在我的全局模型数组中一遍又一遍地附加相同的模型。
正如你在下面看到的,每当我遍历我的所有模型时,它都会继续附加自己。
有没有办法在我的引擎中缓存某些类?或者我在模型本身中使用钩子注册模型的方法中是否存在缺陷?