2011-01-22 23 views
12

guid adlı bir birincil anahtar sütunu içeren bir tablo oluşturmak için bir geçiş komut dosyası yazıyorum ve bir VARCHAR(25). Sorun, bir adımda neyin mümkün olabileceğine ulaşmak için çabalarımı ikiye katlamak zorunda olduğumu hissediyorum.Raylar Geçişi Tablo Oluştur Birincil Anahtar

Koşarsam:

create_table(:global_feeds, :primary_key => 'guid') do |t| 
    t.string :guid, :limit => 25 
    t.text :title 
    t.text :subtitle 

    ... 

    t.timestamps 
end 

hiçbir sütun (istediğim budur) id denilen guid adında bir birincil anahtarla bir tablo olsun. Ancak, sorun, guid sütununun otomatik artışla birlikte INT(11) olmasıdır.

change_column :global_feeds, :guid, :string, :limit => 25 

temelde SQL ben birinde mümkün olması gerektiğine inanıyoruz olsun komutları iki çalıştırmak zorunda kıvrık biraz görünüyor: Ben bir ek komutu çalıştırmak zorunda.

Bunu nasıl optimize edeceğinize dair herhangi bir öneriniz var mı?

cevap

19

yüzden burada size DB motoru üzerinde çalışmaya execute komuta sorgu değişmelidir mySQL üzerinde değilseniz

create_table :global_feeds, {:id => false} do |t| 
    t.string :guid 
    t.text :title 
    t.text :subtitle 
    t.timestamps 
end 
execute "ALTER TABLE global_feeds ADD PRIMARY KEY (guid);" 

deneyebilirsiniz nedir, mySQL kullandığınız varsayalım. Bunu SQLite üzerinde yapabileceğinizden emin değilim. Ve global_feed.rb modelinde yerde bu çizgiyi koymak unutma: Eğer onun kurallarına yapışmasını yaparken

set_primary_key :guid 

Neyse sen Raylar en iyi şekilde alıyoruz. Birincil anahtar adı ve türünü değiştirmek çok iyi bir fikir olmayabilir.

+0

Maalesef, bu hala benimki gibi iki SQL deyimidir. Sadece operasyon sırasını ters çevirdiniz: İlk önce sütun türünü tanımlayın ve ardından ana anahtarı belirtin. – Ryan

+0

Sanırım bunu tek bir işlemde yapamazsın, ama sanırım yanlış bir şey yok. Göçün biraz daha karmaşık durumlar için iki ifadesi olması mükemmel bir şey. –

+0

Ayrıca ActiveRecord, tamsayı olmayan birincil anahtarlar ile gayet iyi çalışıyor mu emin değilim. –

4

#string yerine #column kullanmanız gerekir. varchar tip MySQL dışındaki veritabanlarında taşınabilir olmadığını

create_table(:global_feeds, :primary_key => 'guid') do |t| 
    t.column :guid, "varchar(25)", :null => false 
    ... 
end 

Not: Örneğin.

def self.up 
    create_table(:signups, :id => false) do |t| 
     t.string :token, :primary => true 

çek dışarı birincil anahtar col olarak UUIDs kullanarak için büyük bir çözüm için bu özü:

+0

'sözdizimi hatası, beklenmedik '(', 'anahtar kelimeler_end t.column: guid,: varchar (26),: null => false' Varchar'ın sonunda parantezin işaretlenmesiyle – Ryan

+0

Sağ. varchar (25) "' yerine:: varchar (25) '. – JellicleCat

22

Yapabileceğiniz; zaman @kakoni aşağıdaki eserlerden olarak göç ile rails db:setupcreate_table kontrol Daha fazla bilgi için bana

create_table(:global_feeds, primary_key: :guid, id: false) do |t| 
    t.string :guid 
... 
end 

için problem ArgumentError: Index name '*' on table '*' already exists var thoes için Ruby 5'de,

create_table :global_feeds, id: false do |t| 
    t.string :guid, primary_key: true 
... 
end 
+1

Raylar mükemmel çalışır 4! –

+1

bu bir dize olmamalıdır uuid ile mysql bir ikili (16) olmalı – Seed

+1

Rails 5 çalışır :-) :-) – Maybe1

İlgili konular