Rails: Sütun ekledikten sonra bir dizin ekleme


119

tableBir Rails uygulamasında bir tablo oluşturduğumu varsayalım . Bir süre sonra, çalışan bir sütun ekliyorum:

rails generate migration AddUser_idColumnToTable user_id:string. 

Sonra user_idbir dizin olarak eklemem gerektiğini fark ettim . add_indexYöntemi biliyorum ama bu yöntem nerede çağrılmalıdır? Bir geçiş yapmalı mıyım (evet ise, hangisi?), Sonra bu yöntemi elle eklemem mi gerekiyor?

Yanıtlar:


235

Yalnızca dizin için başka bir taşıma çalıştırabilirsiniz:

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

4
Yani sadece konsolumda çalıştırıyorum: raylar geçişi oluşturur AddIndexToTable?
user1611830

3
Evet, bunu yapabilirsiniz, ancak daha sonra bu geçişi yukarıdaki kodu yansıtacak şekilde düzenlemeniz gerekecektir.
Jaap Haagmans

Mi: tablonun çoğul olması gerekiyor mu?
mezar

1
@tomb Orijinal sorudaki örneği kullandım. :tablegerçek tablo adıdır, bu nedenle bir userstablo olması durumunda yerine :userskoyarsınız :table.
Jaap Haagmans

65

Bir yaratmanız gerekiyorsa, user_idbir kullanıcı tablosuna başvurduğunuz makul bir varsayım olacaktır. Bu durumda göç:

rails generate migration AddUserRefToProducts user:references

Bu komut aşağıdaki geçişi oluşturacaktır:

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

Çalıştırıldıktan sonra tabloya rake db:migratehem bir user_idsütun hem de bir dizin eklenecektir products.

Mevcut bir sütuna, örneğin namebir usertabloya bir dizin eklemeniz gerekirse , aşağıdaki teknik yardımcı olabilir:

rails generate migration AddIndexToUsers name:string:index aşağıdaki geçişi oluşturacak:

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

add_columnSatırı silin ve geçişi çalıştırın.

Açıklanan durumda, rails generate migration AddIndexIdToTable index_id:integer:indexkomut vermiş ve ardından add_columnoluşturulan geçişten satırı silmiş olabilirsiniz . Ancak, ilk geçişi geri almayı ve bunun yerine referans eklemeyi tercih ederim:

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

Tam cevap için teşekkürler Vadym. Son bir soru: neden ilk geçişi geri almanızı önerirsiniz? Daha sonra dizin eklemeyle ilgili herhangi bir performans sorunu var mı?
Flavio Wuensche

2
@ Fwuensche'ye: Daha sonra indeks eklemenin herhangi bir performans cezası yoktur. Etki alanı mantığı yine de daha az net olacaktır. Örneğin, ilişkiyi daha sonra
kesmeye

6
UYARI: index: true değerinin yalnızca create_table geçişinde çalıştığını unutmayın. Taşıma çalışacak, ancak dizin oluşturulmayacaktır. Bkz makandracards.com/makandra/...
rmcsharry

9

Aşağıdakileri sütunu oluşturduktan sonra oluşturulan geçişe ekleyin (örnek)

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

şunun gibi bir şeyi kastediyorsunuz: def self.up add_column ... end add_index ...?
user1611830

6

Referanslar için arayabilirsin

rails generate migration AddUserIdColumnToTable user:references

Gelecekte genel bir dizin eklemeniz gerekirse, bunu başlatabilirsiniz

rails g migration AddOrdinationNumberToTable ordination_number:integer:index

Kodunu oluşturun:

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

0

Bunu kullanabilirsiniz, sadece Job'un cader_id indeksini eklediğiniz modelin adı olduğunu düşünün :

class AddCaderIdToJob < ActiveRecord::Migration[5.2]
  def change
    change_table :jobs do |t|
      t.integer :cader_id
      t.index :cader_id
    end
  end
end
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.