Reabrir um modelo ActiveRecord que é fornecido por uma gema

Estou tentando estender um modelo ActiveRecord (Vote) que uma gema (https://github.com/peteonrails/vote_fu) fornece para o meu aplicativo. (Isto é, não hávote.rb emapp/models)

Minha primeira abordagem foi criar um arquivo chamadolib/extend_vote.rb que contém o código:

Vote.class_eval do
  after_create :create_activity_stream_event
  has_one :activity_stream_event

  def create_activity_stream_event
    # something..
  end
end

Isso funciona quando o primeiro voto é criado, mas quando tento criar cada voto subsequente, recebo o erroTypeError (can't dup NilClass).

Eu acho que esse erro é causado pelo fato de que oVote A classe é recarregada automaticamente após cada solicitação, mas o código emlib/extend_vote.rb é carregado apenas uma vez quando o servidor é iniciado e isso faz com que ohas_one :activity_stream_event associação para se comportar estranhamente. (Além disso, o problema desaparece se eu definirconfig.cache_classes = true emdevelopment.rb)

Para resolver esse problema, tentei recarregar as extensões de votação em todas as solicitações adicionandoto_prepare bloquear para o meudevelopment.rb:

config.to_prepare do
  load 'extend_vote.rb'
end

Isso resolve o(can't dup NilClass) problema, mas agora, sempre que eu criar uma nova votação, ocreate_activity_stream_event callback é chamado um tempo adicional. Ou seja, o primeiro voto chama uma vez, o segundo chama duas vezes, etc, etc. Então, parece que oto_prepare bloco está recarregando a extensão TOO agressivamente e adicionando retornos de chamada duplicados.

Qual é a melhor maneira de adicionar métodos e retornos de chamada a esteVote modelo?

questionAnswers(6)

yourAnswerToTheQuestion