Ich versuche, ein ActiveRecord-Modell (Vote
) zu erweitern, das ein Edelstein (https://github.com/peteonrails/vote_fu) für meine Anwendung bereitstellt. (Dh, es gibt keine vote.rb
in app/models
)Erneutes Öffnen eines ActiveRecord-Modells, das von einem Juwel bereitgestellt wird
Mein erster Ansatz eine Datei lib/extend_vote.rb
genannt zu erstellen war, dass der Code enthält:
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, Erstellen Sie jede nachfolgende Abstimmung Ich bekomme den Fehler TypeError (can't dup NilClass)
.
denke ich, dieser Fehler durch die Tatsache verursacht wird, dass die Vote
Klasse automatisch nach jeder Anfrage neu geladen wird, aber der Code in lib/extend_vote.rb
wird nur einmal geladen, wenn der Server gestartet wird und dies die has_one :activity_stream_event
Vereinigung verursacht weirdly zu verhalten. (Auch geht das Problem weg, wenn ich gesetzt config.cache_classes = true
in development.rb
)
Um dieses Problem zu lösen, habe ich versucht, die Abstimmung Erweiterungen bei jeder Anfrage neu geladen, um durch Hinzufügen eines to_prepare
Block zu meinem development.rb
:
config.to_prepare do
load 'extend_vote.rb'
end
Dies löst das Problem (can't dup NilClass)
, aber jetzt, wenn ich eine neue Abstimmung erstellen, ruft der Rückrufeine zusätzliche Zeit. Das heißt, die erste Stimme ruft sie einmal auf, die zweite ruft sie zweimal auf usw. Es scheint so, als ob der Block to_prepare
die Erweiterung TOO aggressiv neu lädt und doppelte Rückrufe hinzufügt.
Was ist der beste Weg, Methoden und Callbacks zu diesem Vote
Modell hinzuzufügen?
Funktioniert es, wenn Sie 'class Vote' statt' Vote.class_eval' verwenden? Eine Sache, die Sie auch tun können, ist, den Code im Edelstein selbst zu bearbeiten und nur Ihre modifizierte Version zu verwenden. – agmcleod
'class Vote' verhält sich genauso wie' Vote.class_eval' - keiner funktioniert. Ich denke, ich könnte den Edelstein modifizieren, aber ich möchte wirklich nicht lol. Was für ein Chaos! –
Warum denken Sie, dass die Vote-Klasse neu geladen wird? In der Ressource befindet sich die Klasse im Verzeichnis lib, also ist es dasselbe wie Sie ... – Dougui