2016-08-20 5 views
0

Hallo Ich habe eine Seeds-Datei in meiner Rails-App, wo ich alle alten Objekte zu starten, und starten Sie dann eine Auswahl an neuen Objekten. Ich würde erwarten, dass die neuen Objekte mit einer ID von 1 erstellt werden, da alle alten Objekte zerstört wurden, aber neue Objekte mit Ids erstellt werden, die höher sind als alle Ids der alten Objekte. Also für ein Beispiel hatte ich 50 Post Objekte alle mit einer ID von 1-50. Ich habe Post.destroy_all ausgeführt und 50 weitere Post-Objekte erstellt. Alle alten Post-Objekte werden zerstört, aber die neuen Post-Objekte haben alle eine ID von 51-100. Post.find (1) existiert nicht.Nachdem alle Datensätze zerstört wurden, warum werden neue Objekte mit einer ID erstellt, die höher ist als die ID des alten letzten Datensatzes?

Hier ist meine Samen-Datei:

Photo.destroy_all 
Post.destroy_all 
Like.destroy_all 

50.times do 
    Photo.create(name: Faker::Name.name) 
end 


50.times do 
    Post.create(body: Faker::Lorem.paragraph) 
end 


def get_parent 
    resource = [Post, Photo].sample 
    parent = resource.all.sample 
    parent 
end 


150.times do 
    parent = get_parent 
    Like.create(likeable_type: parent.class.name, likeable_id: parent.id) 
end 

Wenn ich rake db laufe: Samt mehrere Male die Ide jede Sammlung von Objekten erhalten 50 höher jeden Lauf. Also, wenn die IDs sind 101 - 150 und ich rake db: seed und die IDs sind jetzt 151-200 mit keine Objekte mit einer ID kleiner als 151.

Wie erstelle ich Objekte mit IDs beginnend bei 1 nach allem Aufzeichnungen wurden zerstört, und warum bekomme ich dieses aktuelle Verhalten?

Danke für die Hilfe.

+0

Wenn Sie einen Neuanfang wünschen, machen Sie einen TRUNCATE auf dem Tisch. Das bloße Löschen von Datensätzen führt nicht zur Wiederverwendung von IDs in relationalen Datenbanken. – ceejayoz

+1

Eine andere Alternative, wenn du deine Dev-Datenbank als wegwerfend behandelst, wie ich, ist es, sie fallen zu lassen und neu zu erstellen. – max

Antwort

2

nur run rake db:reset und es sollte alles zurücksetzen und die DB wieder bei 0 seed.

Das wird Adresse bekommen die Datensätze zurück auf 0, aber warum es tut, dass ich Das liegt daran, dass es so entworfen wurde, wenn Sie die Daten löschen, indem Sie einfach die Daten entfernen und nicht den Platz in der Datenbank löschen, den Sie normalerweise verwenden sollten. Dieses Verhalten ist generell eine gute Sache.

Stellen Sie sich vor, Sie hätten einen Benutzer mit der ID 2, der gelöscht oder gelöscht wird, und Sie haben auch Benutzer 1 und 3. Sie möchten diese ID: 2 nicht unbedingt für Ihren nächsten Benutzer verwenden, sondern geben ihnen aus verschiedenen Gründen eine neue eindeutige ID. Vielleicht ist ihre Benutzerkennung aus Sicherheitsgründen an andere Stellen in der DB gebunden. Ich hoffe, das hilft!

4

Sie sollten schreiben diese in der Seed-Datei nach der Befehlszeile zerstören:

ActiveRecord::Base.connection.reset_pk_sequence!('photos') 
2

Es ist die Sequenz in Ihrer DB, versuchen die Sequenz zurückgesetzt, nachdem durch Ihre Einträge zu löschen:

ALTER SEQUENCE photos_id_seq RESTART WITH 1; 
Verwandte Themen