これは、あなたに役立つ可能性のある非常に一般的なソリューションです。
class Klass
def self.memoized_expensive_method
@memoized_expensive_method_result ||= expensive_method
end
def self.expensive_method
# ...
end
end
次に、リクエストごとにコードが再実行されるようにしたい場合は、コントローラーでフィルターを使用できます。
class Klass
def self.reset_expensive_method_cache!
@memoized_expensive_method_result = nil
end
end
class ApplicationController
before_filter :reset_klass_expensive_method_cache
def reset_klass_expensive_method_cache
Klass.reset_expensive_method_cache!
end
end
クラス変数に何かを格納すると、キャッシュされた結果がスレッド間で共有されるため、スレッドセーフの問題が発生する可能性があることに注意してください。
これがアプリケーションの問題になる可能性がある場合は、クラス変数を使用する代わりにスレッドにデータを格納することをお勧めします。