2016-03-30 20 views
0

kullanıcı en çıkarılırken ID'nin rememberd Michael HartlÖğretici || veritabanından

Açıklama tarafından Raylar Eğitimi takip ediyorum: Şu anda yüz kullanıcı veri tabanında. Daha fazla 50 hesap oluşturuyorum, kullanıcı kimliğinin 101 - 150 değerini aldım. Sonra yönetici onları yok etti. Daha sonra başka bir hesap oluşturduğumda, kullanıcı kimliği 101'i almalıdır çünkü 101-150 kullanıcıları artık orada değildir. Ama bu 151 alır, bu yüzden kullanıcı kimliğim 100'den 151'e sıçramaz.

Bunun nedeni nedir? Hesapları yok ederek yanlış bir şeyler mi var? dosya ve konsol çıkışı aşağıda:

görünüm:

(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> 

kontrolör:

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

konsol çıkış silme kullanıcı zaman:

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

İmhalarınızın çalıştığından emin misiniz? – Albin

+0

Kimlikler benzersizdir ... bu yüzden bir kez atandıktan sonra veritabanını bırakıp tamamen baştan başlamadığınız sürece bu kullanıcı kimliğinde yeni bir kullanıcı olmayacaktır. – toddmetheny

+0

** “Daha sonra başka bir hesap oluşturduğumda, kullanıcı kimliği 101 almalı ...” ** —bu yanlış. Neden sence _should_? Olmamalıdır. Bazı db motorlarında verimlilik uğruna, ids, tam olmayan ve hatta sıralanmamış ve sıralanmamış olabilir. 'Id' alanının nasıl kurulduğuna dikkat etmemelisiniz: bununla ilgilenmek bir db motor görevidir. – mudasobwa

cevap

0

tablo id sütundur otomatik artış. Mysql için bkz. doc. Veritabanını düşürmezseniz veya Alter tablosunu çağırmazsanız, kayıt silinse bile otomatik artış alanları tekrar kullanılmaz.

Neden yapıldığının iyi bir nedeni vardır, böylece veri tutarsızlıklarına neden olabilecek hiçbir yetim ilişkisi yanlışlıkla atanmaz.

+0

“Kayıt silinse bile otomatik artış alanları tekrar kullanılmıyor” —bu yanlış. Bilinen tüm [to me] db motorlarında _current_ autoincrement değeri, "mysql" ve "postgresql" dahil ancak bunlarla sınırlı olmamak üzere ayarlanabilir. – mudasobwa