2012-03-01 18 views
14

Otomatik sıfırlama (1001'den başlayarak) gereken bir alan token_number'i (sadece 1001'den başlayarak) ve yalnızca kullanıcı bunu sağlamazsa, bir Model Token modelim var. Sorun şu ki, kullanıcı bu alanı sağlama seçeneğine sahip olduğundan, veritabanını tam olarak sorgulayamıyorum ve en büyük token_number'i isteyemiyorum. Bu forumda bir cevap buldum, ancak SQL deyimini yürütmekten daha iyi bir yolu olması gerektiğinden eminim. Auto increment a non-primary key field in Ruby on RailsRaylarda bir otomatik artış alanı oluşturun

cevap

12

İlginç soru, benim için. Ne yazık ki, raylar sütunları otomatik olarak arttırmak için bir yol sağlamaz, bu yüzden küçük otomasyon ile SQL'e başvurmalıyız. Benim veritabanı olarak PostgreSQL kullanarak Rails 3.0.7 bu denenmiş ve nasıl çalıştığını ve bu yararlı olacağını umuyoruz: kuruluyor token_number ihtimali olmadığından, PGSql Documentation

class CreateTokens < ActiveRecord::Migration 

    def self.up 
    create_table :tokens do |t| 
     t.string :name 
     t.integer :token_number 

     t.timestamps 
    end 

    execute "CREATE SEQUENCE tokens_token_number_seq START 1001" 
    end 

    def self.down 
    drop_table :tokens 

    execute "DROP SEQUENCE tokens_token_number_seq" 
    end 
end 

Şimdi

token_number için sıra oluşturma Kullanıcı tarafından manuel olarak, yalnızca ayarlanmamışsa token_number değerini oluşturmamız gerekir. Read about Callbacks here. Bununla, bir örnek çalıştırma var. Lütfen ilk jeton için token_number ayarlamam ve token_number dizisini ve ikincisini atadığımı unutmayın.

ruby-1.9.2-p0 > token = Token.new 

=> #<Token id: nil, name: nil, token_number: nil, created_at: nil, updated_at: nil> 
ruby-1.9.2-p0 > token.save 
    SQL (0.8ms) BEGIN 
    SQL (1.7ms) SELECT nextval('tokens_token_number_seq') 
    SQL (6.6ms) SELECT tablename 
FROM pg_tables 
WHERE schemaname = ANY (current_schemas(false)) 

    SQL (33.7ms) INSERT INTO "tokens" ("name", "token_number", "created_at", "updated_at") VALUES (NULL, 1001, '2012-03-02 12:04:00.848863', '2012-03-02 12:04:00.848863') RETURNING "id" 
    SQL (15.9ms) COMMIT 
=> true 
ruby-1.9.2-p0 > token = Token.new 
=> #<Token id: nil, name: nil, token_number: nil, created_at: nil, updated_at: nil> 
ruby-1.9.2-p0 > token.token_number = 3000 
=> 3000 
ruby-1.9.2-p0 > token.save 
    SQL (0.8ms) BEGIN 
    SQL (1.5ms) INSERT INTO "tokens" ("name", "token_number", "created_at", "updated_at") VALUES (NULL, 3000, '2012-03-02 12:04:22.924834', '2012-03-02 12:04:22.924834') RETURNING "id" 
    SQL (19.2ms) COMMIT 
=> true 
ruby-1.9.2-p0 > 
+0

Geri aramaları kullanmaktan kaçınmak için bir şekilde 'nextval' ile birlikte varsayılan değeri kullanmak mümkün mü? – freemanoid

İlgili konular