Я пытаюсь расширить модель 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
?