2010-01-15 15 views
12

Veritabanındaki karşılık gelen 'hesaplar' tablosuna sahip bir 'Hesap' modelim var. Veritabanını silip baştan başlarsam, 'account_id' alanı her zaman 1'de başlayacak ve oradan başlayacak. Başlangıç ​​numarasını değiştirmek istiyorum, böylece ilk hesap yeni bir veritabanında oluşturulduğunda, 'account_id' 1000'tir. Rails'de bunu yapmanın bir yolu var mı, yoksa özel veritabanına ihtiyacım var mı? bağımlı SQL kodu? Bu işlevselliği elde etmek için bazı özel veritabanı bağımlı SQL yapmanız gerekirBaşlangıç ​​kimlik numarasını değiştir

create_table "accounts", :force => true do |t| 
    t.string "email", :null => false 
    t.string "crypted_password", :null => false 
    t.string "name", :null => false 
    t.boolean "email_verified", :default => false 
end 

cevap

10

: Resimde uğruna

, işte 'hesapları' tablosunun basitleştirilmiş bir versiyonudur. MySQL kullanıyorsanız

, sen create_table kodundan sonra göç için aşağıdaki kodu ekleyebilirsiniz: PostgreSQL için

execute("ALTER TABLE tbl AUTO_INCREMENT = 1000") 
+0

Teşekkür Peter! Bu kesinlikle yardımcı olacaktır. –

5

bkz

sekansları tablo 01'de saklanır.(isim, sekans) dizisi zaten var ilk eğer

  • Kontrol?

    select name,seq from sqlite_sequence where name = 'accounts'

sequence.empty olur? Başka

update sqlite_sequence set seq = 1000 where name = 'accounts';

2

diğer olası kavram basitçe modeli dosyasında bir start_at değişkeni kullanmak olabilir

insert into sqlite_sequence(name,seq) values('accounts', 1000);

?

Böyle dönmeden önce veritabanının gerçek kimliği için start_at numarasını ekler ("anahtar" diyebiliriz) gibi start_at = 53131 ve sonra ... bir erişimci yöntemi Yap baz numarasını tanımlamak olarak. Ve anahtarınızı kaydetmeden önce start_at'u çıkartan bir attr yazıcısı yöntemi oluşturabilirsiniz; bu, uygulamanıza bağlı olarak gerekli olmayabilir.

benimle çıplak sözde kod örneği ...

class FakeModel 
    attr_accessible :name 
    start_at = 53121 

    def self.find_by_key(key) 
    find_by_id(key-start_at)) 
    end 

    def key 
    (self.id+start_at) 
    end 
end 

bu ya hatta% 100 işe yarar ama en azından için veritabanını değiştirmek olmazdı eğer ne kadar pratik değil emin hallet.

+0

Bu yaklaşımı tavsiye etmem, işe yararken, veritabanınıza ana sisteminizden başka bir sistemde baktığınız zaman, kimliğiniz yanlış olacaktır. db'nizi bir analiz yazılımına bağlarsanız yanlış kimliği gösterir. – triunenature

2

Saf Yakut, veritabanı bağımsız bir yaklaşım olabilir:

class MyModel 
    before_create do 
    self.id = [1000, self.class.maximum(:id)+1].max if self.id.nil? 
    end 
end 

bir kerede çok fazla kayıt oluştururken, bu kadar iyi olsa performans göstermeyebilir. SQL Server

0

: Benim durumumda

execute('DBCC CHECKIDENT (accounts, reseed, 1000)') 

, geliştirme ortamı ve üretim ortamı veritabanının farklı tip kullanıyor.

DB türüne accordin ilgili yürütme çalışacak Bu kod bloğu - sadece ilgili göç koymak:

puts 'Migration trys to set initial account ID to adapter:' + ActiveRecord::Base.connection.adapter_name 
case ActiveRecord::Base.connection.adapter_name 
    when 'MySQL' 
    execute('ALTER TABLE accounts AUTO_INCREMENT = 1000') 
    when 'SQLServer' 
    execute('DBCC CHECKIDENT (accounts, reseed, 1000)') 
    when 'SQLite' 
    begin 
     execute('insert into sqlite_sequence(name,seq) values(\'accounts\', 1000);') 
    rescue 
     puts 'insert error... updating' 
    end 
    execute('update sqlite_sequence set seq = 1000 where name = \'accounts\';') 
    else 
    puts "cant recognize the database" 
end 
İlgili konular