Ö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?