Rails: Active - Kann ich die ID explizit festgelegt?
-
03-07-2019 - |
Frage
I Active in Rails bin mit verwalten Entitäten in einer separaten Datenbank über REST.
Ich habe versucht worden, um explizit die IDs der Remote-Ressourcen zu verwalten, wie für den aktuellen Fall es am einfachsten ist, nur die lokale Ressource ID wiederverwenden, anstatt ein anderes Feld zu halten.
Leider habe ich nicht in der Lage gewesen, diese Arbeiten als Code für new?
in ActiveResource::Base
zu bekommen, ist
def new?
id.nil?
end
und save
ist
def save
new? ? create : update
end
So aus, dass per Definition ist es unmöglich, eine ID einer Ressource zu setzen und es als eine neue Ressource speichern.
create
und update
sind Methoden geschützt, so dass, wenn ich die Active :: Code-Basis gehackt vielleicht das wäre es funktioniert, aber ich bin nicht willens, das zu tun.
Gibt es einen richtigen Weg, dies zu tun? Oder ist das, was ich versuche einfach nur schlecht zu tun, und ich sollte es nicht tun?
Lösung
Sie arbeiten gegen die Absichten von Active. Active stellt eine Schnittstelle Web Service bereitgestellt REST, die vereinbarungsgemäß die zugewiesene ID zurück, wenn Sie ein erstellen Sie.
Das heißt, wenn Sie die Ressource steuern Sie verwenden, und Sie haben ihr Verhalten geändert, um eine ID zu übernehmen, wenn ein neuer Datensatz gespeichert, können Sie Active ändern :: Base zu entsprechen. Es ist wirklich nicht ungewöhnlich für Leute in Rails zu Ergänzungen und Änderungen an Basisklassen zu machen; Sie nur in lib setzen Sie Ihre Patch und schließen Sie sie irgendwo in Ihrem Autostart-Sachen.
Ich glaube nicht, es ist eine gute Idee, unbedingt, aber es ist möglich. :)
Andere Tipps
In neuen Schienen (getestet 2.3.2) id kann so eingestellt werden, wie die Logik Speichern ein wenig verändert hat (jetzt Datensätze boolean Feld @newrecord haben, dass id.nil zu beseitigen?).
record = Model.new
record.id = 123
record.save!