2013-04-08 9 views
65

Rails uygulamasında bir tablo table oluşturduğumu varsayalım.Raylar: Sütun ekledikten sonra bir dizin eklemek

rails generate migration AddUser_idColumnToTable user_id:string. 

Sonra ben bir endeks olarak user_id eklemem gerekiyor gerçekleştirmek: Daha sonra bazı zaman ben bir sütun çalışan ekleyin. add_index yöntemini biliyorum, ancak bu yöntem nerede çağrılmalıdır? Bir göçü çalıştırmam gerekiyor mu (eğer evet ise hangisi?), Sonra bu yöntemi el ile mi ekliyorsunuz?

Sadece dizin için, başka taşımayı yürütecek

cevap

147

:

class AddIndexToTable < ActiveRecord::Migration 
    def change 
    add_index :table, :user_id 
    end 
end 
+1

Bu yüzden sadece konsolumda çalışıyorum: raylar AddIndexToTable geçişini mi oluşturur? – user1611830

+1

Evet, bunu yapabilirsiniz, ancak yukarıdaki kodu yansıtmak için bu geçişi düzenlemeniz gerekir. –

+0

evet, teşekkürler! – user1611830

7

aşağıdaki (örnek) sütunu oluşturduktan sonra oluşturulan göçün ekle bir user_id oluşturmanız gerekiyorsa

add_index :photographers, :email, :unique => true 
+0

Bunun gibi bir şey demek: def self.up add_column ... end add_index ...? – user1611830

45

o zaman bir kullanıcı tablosuna başvurmak mantıklı bir varsayım olurdu.

class AddUserRefToProducts < ActiveRecord::Migration 
    def change 
    add_reference :user, :product, index: true 
    end 
end 

rake db:migrate bir sütun hem çalıştırdıktan sonra ve bir dizin product tabloya eklenecek:

rails generate migration AddUserRefToProducts user:references 

Bu komut aşağıdaki göç üretecektir: Bu durumda göç olacaktır.

durumda, sadece mevcut bir sütunun, örneğin bir indeks eklemek gerekir Bir user tablonun name aşağıdaki tekniğin yardımcı olabilir:

rails generate migration AddIndexToUsers name:string:index aşağıdaki göç oluşturur:

class AddIndexToUsers < ActiveRecord::Migration 
    def change 
    add_column :users, :name, :string 
    add_index :users, :name 
    end 
end 

add_column satırı silin ve taşıma işlemi başlatın.

Açıklanan durumda, rails generate migration AddIndexIdToTable index_id:integer:index komutunu vermiş olabilirsiniz ve oluşturulan geçişten add_column satırını silebilirsiniz. Bunu başlatabilir gelecekte genel bir dizin eklemek gerekirse

rails generate migration AddUserIdColumnToTable user:references 

çağırabilir

rails generate migration RemoveUserIdFromProducts user_id:integer 
rails generate migration AddUserRefToProducts user:references 
+0

Tam cevap için teşekkürler Vadym. Son bir soru: İlk geçişi neden geri almayı önerdiniz? Daha sonra dizin ekleme ile ilgili herhangi bir performans sorunu var mı? –

+2

@fwuensche için: Daha sonra dizin eklemek için performans cezası yoktur. Ancak, etki alanı mantığı daha az açık olacaktır. Örneğin. Daha sonra ilişkiyi kırmayı/soyutlamayı/vb. yapmaya karar verdiğinizde, iki ayrı göçmenle uğraşmanız gerekirdi, ki bu gerçekten tek bir tane olmalıydı… –

+2

UYARI: Endeks: true sadece bir create_table geçişi. Taşıma çalışacak, ancak dizin oluşturulmayacak. Https://makandracards.com/makandra/32353-psa-index-true-in-rails-migrations-does-not-work-as-you-d-expect sayfasına bakın. – rmcsharry

1

referanslar için: Ama doğrusu ilk göçü geri almak ve yerine başvuru eklemek için tavsiye ediyorum

rails g migration AddOrdinationNumberToTable ordination_number:integer:index 

üret kodu:

class AddOrdinationNumberToTable < ActiveRecord::Migration 
    def change 
    add_column :tables, :ordination_number, :integer 
    add_index :dt_json_structs, :ordination_number, unique: true 
    end 
end