Schienen auto-id zuweisen, die bereits vorhanden ist
Ich einen neuen Datensatz erstellen, etwa so:
truck = Truck.create(:name=>name, :user_id=>2)
Meine Datenbank hat derzeit mehrere tausend Personen für LKW, aber ich wies die id 's zu mehreren von Ihnen, in einer Weise, dass Sie Links einige id' s zur Verfügung. So was passiert, ist rails erzeugt Element mit id = 150 und es funktioniert gut. Aber dann versucht er ein Element erstellen und zuweisen-id = 151, aber diese id existiert bereits, so sehe ich diesen Fehler:
ActiveRecord::RecordNotUnique (PG::Error: ERROR: duplicate key value violates unique constraint "companies_pkey"
DETAIL: Key (id)=(151) already exists.
Und das nächste mal, wenn ich die Aktion, es wird einfach zuweisen der id 152, das wird funktionieren, wenn dieser Wert nicht bereits genommen. Wie kann ich die Schienen um zu prüfen, ob eine ID bereits existiert, bevor es weist?
Dank!
BEARBEITEN
Den LKW-id ist das, was wird dupliziert. Der Benutzer bereits existiert und ist eine Konstante, in diesem Fall. Es ist eigentlich ein Vermächtnis Problem, dass ich zu bewältigen haben. Eine option, um die Tabelle neu erstellen zu lassen Schienen automatische Zuordnung jeder id diese Zeit herum. Ich bin Anfang zu denken, dass dieses möglicherweise die beste Wahl sein, da bin ich noch ein paar andere Probleme, aber die migration, dies zu tun wäre sehr kompliziert, da die LKW-ist ein Fremdschlüssel, der in so vielen anderen Tischen. Würde es eine einfache Möglichkeit zu haben Schienen erstellen Sie eine neue Tabelle mit den gleichen Daten, die bereits gespeichert unter LKW, mit automatisch zugewiesenen ID ' s und die Aufrechterhaltung aller bestehenden Beziehungen?
InformationsquelleAutor der Frage D-Nice | 2012-06-17
Du musst angemeldet sein, um einen Kommentar abzugeben.
Schienen ist wahrscheinlich mit der integrierten PostgreSQL-Sequenz. Die Idee, eine Folge ist, dass es nur einmal verwendet.
Die einfachste Lösung ist, um die Sequenz für Ihr Unternehmen.id-Spalte den höchsten Wert in der Tabelle mit einer Abfrage wie diese:
Ich vermute, dass in Ihrer Sequenz dem Namen "company_id_seq", " Tabellenname "Unternehmen", und Spalte namens "id" ... bitte ersetzen Sie Sie mit den richtigen auszuwählen. Sie können die Sequenz-Namen mit
SELECT pg_get_serial_sequence('tablename', 'columname');
oder schauen Sie auf die definition der Tabelle mit\d tablename
.Eine Alternative Lösung ist das überschreiben der save () - Methode in Ihrem Unternehmen Klasse manuell der Firma id für neue Zeilen vor dem speichern.
InformationsquelleAutor der Antwort Dondi Michael Stroma
Habe ich dies löste das Problem für mich.
Fand ich die reset_pk_sequence! aus diesem thread. http://www.ruby-forum.com/topic/64428
InformationsquelleAutor der Antwort Apie
Basierend auf @Apie Antwort.
Können Sie eine Aufgabe und führen Sie, wenn Sie Sie brauchen mit:
Erstellen Sie Aufgaben wie diese:
Und in die erzeugte Datei (
lib/tasks/database.rake
):InformationsquelleAutor der Antwort inye
Klingt für mich wie ein Datenbank-problem und nicht ein Rails problem. Ist es möglich, Ihre Datenbank hat eine falsche Identität Samen auf Ihrem
id
Spalte? Um zu testen, versuchen Sie ein paar Einsätze direkt in Ihre Datenbank und sehen, ob das gleiche Verhalten existiert.InformationsquelleAutor der Antwort mynameiscoffey