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
14
A
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 >
Geri aramaları kullanmaktan kaçınmak için bir şekilde 'nextval' ile birlikte varsayılan değeri kullanmak mümkün mü? – freemanoid