私は親モデルの集約フィールドを簡単にキャッシュできる単純なCacheableモジュールを作成しました。このモジュールでは、親オブジェクトが、親レベルでのキャッシュを必要とするフィールドごとにcacheable
メソッドとメソッドを実装する必要があります。Rubyメタプログラミングを使用してコールバックをRailsモデルに追加するにはどうすればよいですか?
module Cacheable
def cache!(fields, *objects)
objects.each do |object|
if object.cacheable?
calc(fields, objects)
save!(objects)
end
end
end
def calc(fields, objects)
fields.each { |field| objects.each(&:"calc_#{field}") }
end
def save!(objects)
objects.each(&:save!)
end
end
このモジュールが含まれるActiveRecordモデルにコールバックを追加したいと思います。この方法では、モデルが親モデルのハッシュとキャッシングが必要なフィールド名を実装する必要があります。
def cachebacks(klass, parents)
[:after_save, :after_destroy].each do |callback|
self.send(callback, proc { cache!(CACHEABLE[klass], self.send(parents)) })
end
end
私は手動でのような使用して、両方のコールバックを追加する場合、このアプローチは素晴らしい作品:
after_save proc { cache!(CACHEABLE[Quote], *quotes.all) }
after_destroy proc { cache!(CACHEABLE[Quote], *quotes.all) }
しかし、私は、コールバックにこれらを追加するcachebacks
メソッドを使用しようとすると、私は次のエラーを受信しています。
cachebacks(Quote, "*quotes.all")
NoMethodError: undefined method `cachebacks' for #<Class:0x007fe7be3f2ae8>
これらのコールバックをクラスに動的に追加するにはどうすればよいですか?
申し訳ありませんが、最後の部分の意味を理解できませんでした。 'Quote'は関連モデルですか?あなたのクラスが今のように見えるように投稿してください。 –
あなたのヒントに基づいて私が試した答えは物事を説明する必要があります。私はActiveSupport :: Concernのアプローチにも興味があります。 – barelyknown