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?