2016-03-30 11 views
0

Ich verfolge die Rails-Tutorial von Michael HartlLernprogramm || IDs rememberd wenn aus der Datenbank des Benutzers zu entfernen

Erläuterung: Derzeit hundert Benutzer in der Datenbank. Ich erstelle 50 Konten mehr, sie erhalten Benutzer-ID 101 - 150. Dann zerstört der Admin sie. Wenn ich dann ein weiteres Konto erstelle, sollte es die Benutzer-ID 101 erhalten, weil die Benutzer 101-150 nicht mehr da sind. Aber es wird 151, also springt meine Benutzer-ID von 100 auf 151 mit nichts dazwischen.

Was verursacht das? Es ist etwas falsch, die Konten zu zerstören? unterhalb der Dateien und Konsolausgabe:

Die Ansicht:

(app/views/_user.html.erb) 
<li> 
<%= gravatar_for user, size: 50 %> 
<%= link_to user.name, user %> 
<% if current_user.admin? && !current_user?(user) %> 
    | <%= link_to "delete", user, method: :delete, 
          data: { confirm: "You sure?" } %> 
<% end %> 
</li> 

Der Controller:

def destroy 
    User.find(params[:id]).destroy 
    flash[:success] = "User deleted" 
    redirect_to users_url 
end 

der Ausgabekonsole beim Löschen Benutzer:

Started DELETE "https://stackoverflow.com/users/102" for $IP at 2016-03-30 12:11:52 +0000 
Processing by UsersController#destroy as HTML 
Parameters: {"authenticity_token"=>"Kj+2TnvVk8jVrZi1leVeQRAjJbZsKqXAhA1cjK/WNDa4TieY54NdD6OCATNANFR0lh1trhi+ZzvMLhnirZnw+g==", "id"=>"102"} 
User Load (0.3ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 1]] 
User Load (0.2ms) SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 102]] 
(0.1ms) begin transaction 
SQL (0.3ms) DELETE FROM "users" WHERE "users"."id" = ? [["id", 102]] 
(10.7ms) commit transaction 
+0

Sind Sie sicher, dass Ihr Zerstörer funktioniert? – Albin

+0

IDs sind eindeutig ... also einmal zugewiesen gibt es keinen neuen Benutzer bei dieser ID, es sei denn, Sie legen die Datenbank ab und beginnen von vorne. – toddmetheny

+0

** "Wenn ich dann noch ein Konto erstelle, sollte es User ID 101 bekommen ..." ** - das ist einfach falsch. Warum würdest du denken, dass es _should_? Es sollte nicht. Aus Gründen der Effizienz in einigen db-Engines könnten ids sogar Nicht-Ganzzahlen sein, außerdem könnten sie nicht-geordnet und nicht-sequentiell sein. Sie sollten sich nicht darum kümmern, wie "ID" -Feld konstruiert wird: Es ist eine Pflicht der db-Engine, sich darum zu kümmern. – mudasobwa

Antwort

0

Die Tabelle-ID-Spalte ist automatisches Inkrement. Für mysql siehe doc. Autoinkrementierungsfelder werden nicht erneut verwendet, selbst wenn der Datensatz gelöscht wird, es sei denn, Sie löschen die Datenbank oder rufen Alter Table auf.

Es gibt guten Grund, warum es getan wird, so dass keine verwaisten Beziehungen versehentlich zugewiesen werden, die Dateninkonsistenzen verursachen können.

+0

"Autoinkrementierungsfelder werden nicht erneut verwendet, selbst wenn der Datensatz gelöscht wird" - das ist falsch. Man könnte den _current_ autoincrement Wert in allen bekannten [mir] db Engines setzen, einschließlich, aber nicht beschränkt auf mysql und postgresql. – mudasobwa