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?

Respuestas a la pregunta(6)

Su respuesta a la pregunta