2009-03-14 9 views
4

Ich versuche, eines meiner Objekte in meiner Rails-App zu aktualisieren, und die Änderungen bleiben einfach nicht erhalten. Es gibt keine Fehler, und das Durchlaufen des Debuggers zeigt nur, dass es denkt, dass alles aktualisiert wird.Speichern von Updates für Objekte in Schienen

Wie auch immer, hier ist der Code in Frage ...

qm = QuestionMembership.find(:first, :conditions => ["question_id = ? AND form_id = ?", q_id, form_id]) 
    qm.position = x 
    qm.save 

Zum Vergleich willen, hat QuestionMembership question_id, form_id und Positionsfelder. Alle sind Ganzzahlen und haben keine DB-Beschränkungen.

Das ist im Grunde meine Join Tabelle zwischen Forms und Fragen.

Beim Durchlaufen des Codes erhält qm ein gültiges Objekt, die Position des Objekts wird auf den Wert von x geändert und return returns 'true'.

Nach dem Beenden der Methode bleibt das Objekt in der Datenbank jedoch unverändert.

Was fehlt mir?

+0

Was ist qm.save! Rückkehr? –

Antwort

0

Stellt sich heraus, dass es das falsche SQL ausgab. Im Grunde suchte es nach dem QuestionMembeship-Objekt durch die ID-Spalte, die nicht existiert.

Ich hatte den Eindruck, dass diese Spalte mit has_many_through Beziehungen unnötig war, obwohl es scheint, dass ich fehlgeleitet war.

Um zu beheben, fügte ich einfach die ID-Spalte der Tabelle als Primärschlüssel hinzu. Danke für alle Hinweise.

0

Versuchen Sie, qm.save auf qm.save zu ändern! und sehen, ob Sie eine Ausnahmebedingung erhalten.

Edit: Was passiert, wenn Sie das Protokoll auf den Anruf zu .save !? Generiert es das erwartete SQL?

+0

Gleiches Ergebnis. Ich bin verwirrt, um es milde auszudrücken. –

+0

Ich bin Thomas, schön, dich zu treffen, verwirrt! ;) – Thomas

+0

Was passiert, wenn Sie den Anruf bei .save!Generiert es das erwartete SQL? –

0

Was ist das Ergebnis qm.save? Richtig oder falsch? Und was ist mit qm.errors, bietet das alles, was für Sie Sinn macht? Und was sagt das development.log?

8

Möglicherweise finden Sie nicht das Objekt, von dem Sie denken, dass Sie es sind. Einige Experimente in irb könnten aufschlussreich sein.

Auch als allgemeine Regel, wenn nur ein Attribut zu ändern, ist es besser,

qm.update_attribute(:position, x) 

statt Setzen und Speicher zu schreiben. Rails aktualisiert dann nur diese Spalte anstelle der gesamten Zeile. Und Sie profitieren auch von den Daten, die geschrubbt werden.

0

Ich habe auf dieses Problem ziemlich häufig gestoßen. (Ich wollte fortwährend sagen, aber ich kann nicht, da dies bedeuten würde, dass ich wissen würde, wann es passieren würde.)

Während ich keine Lösung für das zugrunde liegende Problem habe, habe ich festgestellt, dass es scheint zu passieren zu mir nur, wenn ich versuche, mysql text Felder zu aktualisieren. Meine Abhilfe wurde das Feld zu setzen so etwas wie zu tun:

qm.position = "" 
qm.save 
qm.position = x 
qm.save 

Und zu beantworten alle anderen ... wenn ich qm.save! laufen bekomme ich keine Fehler. Ich habe es nicht versucht qm.save?

Wenn ich durch meinen Code in der Rails-Konsole läuft alles perfekt funktioniert, wie durch das erneute Finden des Objekts mit der gleichen Abfrage zeigt, bringt die erwarteten Ergebnisse.

Ich habe das gleiche Problem, wenn qm.update_attribute(... auch

Meine Abhilfe mich bis hierher hinkend bekommen hat verwenden, aber hoffentlich jemand auf diesem Thread wird helfen können.

1

Gibt es einen After_Save?

Wird das richtige SQL ausgegeben?

+0

Falsches SQL kommt heraus. Was es macht, ist: UPDATE "Frage_Mitgliedschaften" SET "Position" = 3, "updated_at" = '2009-03-17 19:09:44' WHERE "ID" = NULL Da dies eine Join-Tabelle ist Es gibt kein "ID" -Feld. Zurück zum Zeichenbrett. Ich dachte, beitreten Tabellen nicht wie ID-Felder. –

+0

Ich würde vermuten, dass rails nicht weiß, dass es keine id erwarten sollte. Ich würde die Anweisungen has_many, soeigns_to usw. in den Klassen "Question", "Membership" und "QuestionMembership" überprüfen. – wombleton

+0

Überprüfen Sie diese http://stackoverflow.com/questions/522408/how-to-manage-table-without-id-in-rails out: es kann sein, dass Sie nach has_and_belongs_to_many statt der "moderneren" Join- als vollständiges Objekt. – wombleton

1

Im Entwicklungsprotokoll können Sie tatsächlich die sql sehen, die generiert wird.

Für etwas wie folgt aus:

qm = QuestionMembership.find(:first, :conditions => ["question_id = ? AND form_id = ?", q_id, form_id]) 
qm.position = x 
qm.save 

Sie sollten etwas zum Effekt von sehen:

SELECT * FROM question_memberships WHERE question_id=2 AND form_id=6 LIMIT 1 
UPDATE question_memberships SET position = x WHERE id = 5 

können Sie die Ausgabe, welche SQL Sie tatsächlich sehen, so können wir vergleichen?

0

Verwenden ./script/console und dieses Skript .. Schritt für Schritt ..

sehen, ob das Positionsfeld für das Objekt-Update ist oder nicht, wenn Sie Zeile 2

dann traf qm. speichern oder qm.save! ... zu testen

sehen, was passiert. Auch als Tim erwähnt .. überprüfen Sie die Protokolle

0

Ihre QuestionMembership Klasse überprüfen und diese Position nicht überprüft, so etwas wie

attr_readonly :position 

Der beste Weg, diese haben zu debuggen ist

tail -f log/development.log 

zu tun und Öffnen Sie dann eine andere Konsole und führen Sie den Code aus, der die Speicheranweisung ausführt. Stellen Sie sicher, dass die aktuelle SQL Update-Anweisung ausgeführt wird.

0

Überprüfen Sie, ob Ihre Datenbankeinstellungen korrekt sind. Wenn Sie mit mehreren Datenbanken arbeiten (oder die Standard-SQLite3-Datenbank nicht in MySQL geändert haben), arbeiten Sie möglicherweise mit der falschen Datenbank.

Führen Sie die Befehle in ./script/console aus, um festzustellen, ob das gleiche Verhalten angezeigt wird.

Überprüfen Sie, ob ein ähnliches Objekt (zB ein Formular oder eine Frage) gespeichert wird.

Wenn das Formular oder die Frage gespeichert wird, finden Sie den Unterschied zwischen der QuestionMembership und Form oder Frage Objekt.

1

aktualisieren entweder das Attribut oder rufen Sie:

qm.reload 

nach dem qm.save

Verwandte Themen