Ich erstelle einen neuen Rekord wie folgt:
truck = Truck.create(:name=>name, :user_id=>2)
Meine Datenbank enthält derzeit mehrere tausend Entitäten für LKWs, aber ich habe die IDs mehreren von ihnen so zugewiesen, dass einige IDs verfügbar waren. Was also passiert, ist, dass Rails ein Element mit der ID = 150 erstellt und es funktioniert einwandfrei. Aber dann wird versucht, ein Element zu erstellen und es zuzuweisen. ID = 151, aber diese ID ist möglicherweise bereits vorhanden. Daher wird der folgende Fehler angezeigt:
ActiveRecord::RecordNotUnique (PG::Error: ERROR: duplicate key value violates unique constraint "companies_pkey"
DETAIL: Key (id)=(151) already exists.
Und wenn ich das nächste Mal die Aktion ausführe, wird einfach die ID 152 zugewiesen, die einwandfrei funktioniert, wenn dieser Wert noch nicht vergeben ist. Wie kann ich Rails veranlassen, zu überprüfen, ob eine ID bereits vorhanden ist, bevor sie zugewiesen wird?
Vielen Dank!
BEARBEITEN
Die LKW-ID wird dupliziert. Der Benutzer existiert bereits und ist in diesem Fall eine Konstante. Es ist tatsächlich ein altes Problem, mit dem ich mich befassen muss. Eine Möglichkeit besteht darin, die Tabelle bei let Rails neu zu erstellen und diesmal jede ID automatisch zuzuweisen. Ich fange an zu denken, dass dies die beste Wahl ist, weil ich einige andere Probleme habe, aber die Migration dafür wäre sehr kompliziert, da Truck in so vielen anderen Tabellen ein Fremdschlüssel ist. Gibt es eine einfache Möglichkeit, Rails eine neue Tabelle mit denselben Daten erstellen zu lassen, die bereits unter Truck gespeichert sind, mit automatisch zugewiesenen IDs und unter Beibehaltung aller vorhandenen Beziehungen?
quelle
Antworten:
Rails verwendet wahrscheinlich die integrierte PostgreSQL-Sequenz. Die Idee einer Sequenz ist, dass sie nur einmal verwendet wird.
Die einfachste Lösung besteht darin, die Reihenfolge für die Spalte "company.id" mit einer Abfrage wie der folgenden auf den höchsten Wert in der Tabelle festzulegen:
Ich vermute Ihren Sequenznamen "company_id_seq", Tabellennamen "company" und Spaltennamen "id" ... bitte ersetzen Sie sie durch die richtigen. Sie können den Sequenznamen mit
SELECT pg_get_serial_sequence('tablename', 'columname');
abrufen oder die Tabellendefinition mit anzeigen\d tablename
.Eine alternative Lösung besteht darin, die save () -Methode in Ihrer Unternehmensklasse zu überschreiben, um die Unternehmens-ID für neue Zeilen vor dem Speichern manuell festzulegen.
quelle
create table t (id serial not null primary key); insert into t values (1); insert into t values (default); ERROR: duplicate key value violates unique constraint "t_pkey" DETAIL: Key (id)=(1) already exists.
Ich habe dies getan, was das Problem für mich gelöst hat.
Ich habe die reset_pk_sequence gefunden! von diesem Thread. http://www.ruby-forum.com/topic/64428
quelle
ActiveRecord::Base.connection.tables.each { |t| ActiveRecord::Base.connection.reset_pk_sequence!(t) }
Basierend auf @Apie Antwort .
Sie können eine Aufgabe erstellen und bei Bedarf ausführen mit:
Sie erstellen Aufgaben wie folgt:
Und in die generierte Datei (
lib/tasks/database.rake
) setzen:quelle
Klingt für mich nach einem Datenbankproblem und nicht nach einem Rails-Problem. Ist es möglich, dass Ihre Datenbank einen falschen Identitätsstart in Ihrer
id
Spalte enthält? Versuchen Sie zum Testen, einige Einfügungen direkt in Ihre Datenbank vorzunehmen, und prüfen Sie, ob dasselbe Verhalten vorliegt.quelle
Ich habe dieses Problem mit dem folgenden Befehl behoben.
Führen Sie dies in Ihrer Rails-Konsole aus
quelle