Öffnen Sie erneut ein ActiveRecord-Modell, das von einem Edelstein bereitgestellt wird

Ich versuche, ein ActiveRecord-Modell zu erweitern (Vote) dass ein Juwel (https://github.com/peteonrails/vote_fu) liefert zu meiner Bewerbung. (Das heißt, es gibt keinevote.rb imapp/models)

Mein erster Ansatz war, eine Datei mit dem Namen zu erstellenlib/extend_vote.rb das enthält den Code:

Vote.class_eval do
  after_create :create_activity_stream_event
  has_one :activity_stream_event

  def create_activity_stream_event
    # something..
  end
end

Dies funktioniert, wenn die erste Abstimmung erstellt wird, aber wenn ich versuche, jede nachfolgende Abstimmung zu erstellen, erhalte ich den FehlerTypeError (can't dup NilClass).

Ich denke, dass dieser Fehler durch die Tatsache verursacht wird, dass dieVote Klasse wird nach jeder Anfrage automatisch neu geladen, aber der Code inlib/extend_vote.rb wird nur einmal beim Serverstart geladen und dies bewirkt diehas_one :activity_stream_event Assoziation, sich seltsam zu verhalten. (Auch das Problem verschwindet, wenn ich eingestellt habeconfig.cache_classes = true imdevelopment.rb)

Um dieses Problem zu lösen, habe ich versucht, die Abstimmungserweiterungen bei jeder Anfrage neu zu laden, indem ich eine hinzufügteto_prepare Block zu meinemdevelopment.rb:

config.to_prepare do
  load 'extend_vote.rb'
end

Dies löst die(can't dup NilClass) Problem, aber jetzt, wenn ich eine neue Abstimmung erstellen, diecreate_activity_stream_event Rückruf wird eine zusätzliche Zeit angerufen. Das heißt, die erste Stimme nennt es einmal, die zweite nennt es zweimal usw. usw. So scheint es wie dieto_prepare Block lädt die Erweiterung TOO aggressiv neu und fügt doppelte Rückrufe hinzu.

Was ist der beste Weg, um Methoden und Rückrufe hinzuzufügenVote Modell?

Antworten auf die Frage(6)

Ihre Antwort auf die Frage