Re -открыть модель ActiveRecord, предоставленную гемом

Я пытаюсь расширить модель ActiveRecord (Vote). что драгоценный камень(https://github.com/peteonrails/vote_fu)предоставляет моему приложению. (То есть 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перезагружается автоматически после каждого запроса, но код в 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СЛИШКОМ агрессивно перезагружает расширение и добавляет повторяющиеся обратные вызовы.

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

5
задан Tom Lehman 25 May 2012 в 20:37
поделиться