Снова откройте модель 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
модель?