Vuelva a abrir un modelo ActiveRecord proporcionado por una gema.
Estoy tratando de extender un modelo ActiveRecord (Vote
) que una gema (https://github.com/peteonrails/vote_fu) proporciona a mi aplicación. (Es decir, no hayvote.rb
enapp/models
)
Mi primer enfoque fue crear un archivo llamadolib/extend_vote.rb
que contiene el 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
Esto funciona cuando se crea el primer voto, pero cuando intento crear cada voto subsiguiente recibo el errorTypeError (can't dup NilClass)
.
Creo que este error es causado por el hecho de queVote
La clase se vuelve a cargar automáticamente después de cada solicitud, pero el código enlib/extend_vote.rb
se carga solo una vez cuando el servidor se inicia y esto hace que elhas_one :activity_stream_event
Asociación para comportarse de forma extraña. (Además, el problema desaparece si configuroconfig.cache_classes = true
endevelopment.rb
)
Para resolver este problema, traté de hacer que las extensiones de voto se volvieran a cargar en cada solicitud agregando unto_prepare
bloque a midevelopment.rb
:
config.to_prepare do
load 'extend_vote.rb'
end
Esto resuelve el(can't dup NilClass)
problema, pero ahora cada vez que creo un nuevo voto, elcreate_activity_stream_event
La devolución de llamada se llama un tiempo adicional. Es decir, el primer voto lo llama una vez, el segundo lo llama dos veces, etc., etc. Así que parece que elto_prepare
el bloque está recargando la extensión TOO agresivamente y agregando devoluciones de llamada duplicadas.
¿Cuál es la mejor manera de agregar métodos y devoluciones de llamada a esto?Vote
¿modelo?