2009-04-02 8 views
2

Ich habe ein paar Modelle, die mit dem has_manybelongs_to Paar verbunden sind. Zur Demonstration hat ein Client einen Server, aber ein Server hat viele Clients. Ich könnte so etwas tun:Können Sie Activecord-Verknüpfungen erzwingen, ohne sie zu speichern?

client1.server = the_server 
client2.server = the_server 
client3.server = the_server 

Meine eigentliche Anwendung ist ein bisschen komplexer als das, aber das Beispiel wird zur Veranschaulichung arbeiten.

Ich möchte die Verknüpfungen zwischen diesen Objekten überprüfen, bevor ich sie speichere. ActiveRecord aktualisiert ihre Informationen nicht, bis sie gespeichert werden. Im obigen Beispiel hat the_server keine Ahnung, wer client1, client2 oder client3 sind, bis einer von ihnen gespeichert wird. Ich bin mir sicher, dass dies der Effizienz von active_record hilft, aber Modellinstanzen im Speicher in einem inkonsistenten Zustand belässt.

Gibt es irgendetwas, das ich auf den Clients oder auf dem Server aufrufen kann, die sie ihren Status aktualisieren lassen?

+0

3 und ein halbes Jahr später und ich habe das gleiche Problem, aber in meinem Fall können die Modelle inkonsistent werden. Alles hinzufügen? –

Antwort

1

Rufen Sie die Objekte #reload auf, um sie zu aktualisieren.

+1

Das erfordert, dass die Objekte zuerst gespeichert werden, oder? Nachladen sagt, holen Sie die Informationen von der Datenbank wieder. Wenn client1,2 und 3 nicht gespeichert werden, muss nichts neu geladen werden. – srboisvert

+0

Das ist auch mein Verständnis. Ich möchte nicht von der Datenbank aktualisieren - ganz im Gegenteil: Ich möchte, dass die Objekte aktualisiert werden, als wären sie gespeichert worden. – Sniggerfardimungus

+0

Dies ist ein großes Anti-Muster, das anzeigt, dass die Modellierung Probleme hat. Verwenden Sie 'clear_association_cache', wenn ein Objekt verknüpfte Objekte neu laden soll, da die aktuellen Assoziationen nicht mehr aktuell sind. Das erneute Laden selbst kann manchmal Endlosschleifen erzeugen und wird auch 5-mal in einer Anfrage aufgerufen, weil "Du bist nur nicht sicher" wenn das Objekt neu geladen wurde, abhängig von dem Controller/Modell, in dem du dich gerade befindest – drhenner

0

Wenn Sie so beginnen:

client1 = the_server.clients.build(:name => 'a client', ...) 

Dann sollten Sie bekommen, was Sie suchen, denke ich.

EDIT:

Hoppla, Ich lese Ihren Beitrag und erkennen, dass the_server noch nicht entweder gespeichert. vielleicht in diesem Fall:

client1.server = the_server 
the_server.clients << client1 

(beachten Sie, dass diese client1 sparen, wenn the_server bereits gespeichert)

oder:

the_server.clients.build(:name => 'some client', ..., :server => the_server) 

Ein bisschen so vielleicht überflüssig gibt es einen besseren Weg gibt, .

0

Wenn Sie den umgekehrten Weg zur Schaffung des Vereins nutzen, dann sind Sie in der Lage, bevor die Modelle zu suchen, um sie gespeichert werden:

the_server.clients << client1 
the_server.clients << client2 
the_server.clients << client3 

Beachten Sie jedoch, dass Sie nur client1.server nennen kann sofort nach, wenn the_server ist bereits vorhanden.

Verwandte Themen