Railsの自動ロードが開発/テスト環境でどのように機能するかに関する問題が発生しました。私が達成しようとしているのは、親クラスのプラグイン可能な実装の一種であり、アプリケーションの起動時に変更できます。より詳細には、私は、次のアイデアをクラスMeasure
を実装している:Railsオートローディング:テスト間で定数が失われる、または循環依存が導入される
# app/models/measure.rb
class Measure
attr_reader :implementations
def self.register(klass)
@implementations << klass
end
def self.from(raw_value)
# ... find a suitable implementation and instantiate it
end
# ...
end
そして私は、次のような異なるMeasures
の実装があります。これらは、その後、このような呼び出しを使用して設定する必要があります
# app/models/measures/grams.rb
module Measures
class Grams < Measure
# ... code to tell Measures if this class can be
# instantiated from a given raw value
end
end
をMeasure.register(Measures::Grams)
となります。
問題は、私がイニシャライザでこれを行うと、定数のキャッシュが明らかにパージされるため、テストの実行間に測定の実装が失われることです。つまり、有効なはずのMeasure.from("2 grams")
などのコールは、Measure.implementations
にはMeasures::Grams
が含まれていないため、機能しなくなります。一方、app/models/measure.rb
にrequire_dependency
を追加すると、登録を行うコードを参照して、RailsがMeasure
クラスをロードする前に、実装の1つを参照するときに循環依存性があります。 Railsがオートローディングをどのようにしているのかを少しだけ調べて読んだところ、私は満足のいく解決策を思いつきませんでした。
私の質問は次のとおりです。この階層は、Railsがコードを自動ロードする方法とうまくやるように設定する必要がありますか?