Снова откройте модель ActiveRecord, предоставленную гемом.

Я пытаюсь расширить модель ActiveRecord Vote) что драгоценный камень https: //github.com/peteonrails/vote_f) предоставляет мое приложение. (Т.е. нетvote.rb вapp/models)

Мой первый подход состоял в том, чтобы создать файл с именемlib/extend_vote.rb, содержащий код:

Vote.class_eval do
  after_create :create_activity_stream_event
  has_one :activity_stream_event

  def create_activity_stream_event
    # something..
  end
end

Это работает, когда создается первый голос, но когда я пытаюсь создать каждый последующий голос, я получаю ошибкуTypeError (can't dup NilClass).

Я думаю, что эта ошибка вызвана тем, чтоVote class перезагружается автоматически после каждого запроса, но код вlib/extend_vote.rb загружается только один раз, когда сервер запускается, и это вызываетhas_one :activity_stream_event Ассоциация вести себя странно. (Кроме того, проблема исчезнет, если я установлюconfig.cache_classes = true вdevelopment.rb)

Чтобы решить эту проблему, я попытался перезагрузить расширения голосов при каждом запросе, добавивto_prepare заблокировать мойdevelopment.rb:

config.to_prepare do
  load 'extend_vote.rb'
end

Это решает(can't dup NilClass) проблема, но теперь, когда я создаю новый голос,create_activity_stream_event обратный вызов вызывается в дополнительное время. То есть первый голос вызывает его один раз, второй - дважды, и т. Д., И т. Д. Так что, похоже,to_prepare block слишком активно перезагружает расширение и добавляет дубликаты обратных вызовов.

Какой лучший способ добавить методы и обратные вызовы к этомуVote модель?

Ответы на вопрос(6)

Ваш ответ на вопрос