開発中は、クラス内にメソッドを含めてアプリ内のすべてのモデルを収集し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
に、モデル内のメソッドが呼び出され、モデルのグローバル配列内に同じモデルが何度も追加されます。
以下に示すように、すべてのモデルをループするたびに、それ自体が追加され続けます。
エンジン内に特定のクラスをキャッシュする方法はありますか?または、モデル自体のフックにモデルを登録するという私のアプローチに欠陥がありますか?