Como eu uso a metaprogramação Ruby para adicionar callbacks a um modelo Rails?

Eu escrevi um módulo Cacheable simples que simplifica o cache de campos agregados em um modelo pai. O módulo requer que o objeto pai implemente ocacheable método e umcalc_ método para cada campo que requer o armazenamento em cache no nível pai.

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

Gostaria de adicionar retornos de chamada ao modelo ActiveRecord no qual este módulo está incluído. Esse método exigiria que o modelo implementasse um hash de modelos pai e nomes de campo que exigem armazenamento em cache.

def cachebacks(klass, parents)
  [:after_save, :after_destroy].each do |callback|
    self.send(callback, proc { cache!(CACHEABLE[klass], self.send(parents)) })
  end
end

Essa abordagem funciona muito bem se eu adicionar manualmente os dois callbacks usando:

after_save proc { cache!(CACHEABLE[Quote], *quotes.all) }
after_destroy proc { cache!(CACHEABLE[Quote], *quotes.all) }

Mas estou recebendo o seguinte erro quando tento usar ocachebacks método para adicioná-los a retornos de chamada.

cachebacks(Quote, "*quotes.all")

NoMethodError: undefined method `cachebacks' for #<Class:0x007fe7be3f2ae8>

Como adiciono esses retornos de chamada à classe dinamicamente?

questionAnswers(3)

yourAnswerToTheQuestion