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?

War es hilfreich?

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!
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top