Otwórz ponownie model ActiveRecord dostarczany przez klejnot

Próbuję rozszerzyć model ActiveRecord (Vote) że klejnot (https://github.com/peteonrails/vote_fu) zapewnia moją aplikację. (To znaczy, nie mavote.rb wapp/models)

Moim pierwszym podejściem było stworzenie pliku o nazwielib/extend_vote.rb który zawiera kod:

Vote.class_eval do
  after_create :create_activity_stream_event
  has_one :activity_stream_event

  def create_activity_stream_event
    # something..
  end
end

Działa to, gdy tworzony jest pierwszy głos, ale gdy próbuję utworzyć każdy kolejny głos, otrzymuję błądTypeError (can't dup NilClass).

Myślę, że ten błąd jest spowodowany tym, żeVote klasa jest ładowana automatycznie po każdym żądaniu, ale kod wlib/extend_vote.rb jest ładowany tylko raz podczas uruchamiania serwera i powoduje tohas_one :activity_stream_event stowarzyszenie zachowywać się dziwnie. (Ponadto problem zniknie, jeśli ustawięconfig.cache_classes = true wdevelopment.rb)

Aby rozwiązać ten problem, starałem się, aby rozszerzenia głosowe przeładowywały się na każde żądanie, dodającto_prepare blok do mojegodevelopment.rb:

config.to_prepare do
  load 'extend_vote.rb'
end

To rozwiązuje(can't dup NilClass) problem, ale teraz, kiedy tworzę nowy głos,create_activity_stream_event wywołanie zwrotne jest wywoływane przez dodatkowy czas. To znaczy, pierwszy głos wywołuje go raz, drugi wywołuje go dwa razy, itd. Itd. Wygląda więc na to, żeto_prepare blok przeładowuje rozszerzenie ZBYT agresywnie i dodaje zduplikowane wywołania zwrotne.

Jaki jest najlepszy sposób dodawania metod i wywołań zwrotnych do tegoVote Model?

questionAnswers(6)

yourAnswerToTheQuestion