Rails: Thêm chỉ mục sau khi thêm cột


119

Giả sử tôi đã tạo một bảng tabletrong ứng dụng Rails. Một thời gian sau, tôi thêm một cột đang chạy:

rails generate migration AddUser_idColumnToTable user_id:string. 

Sau đó, tôi nhận ra mình cần thêm user_iddưới dạng chỉ mục. Tôi biết về add_indexphương pháp này, nhưng phương pháp này nên được gọi ở đâu? Tôi có phải chạy một quá trình di chuyển (nếu có, cái nào?), Sau đó thêm bằng tay phương pháp này?

Câu trả lời:


235

Bạn có thể chạy một quá trình di chuyển khác, chỉ dành cho chỉ mục:

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

4
Vì vậy, tôi chỉ cần chạy trong bảng điều khiển của mình: rails tạo di chuyển AddIndexToTable?
user1611830

3
Có, bạn có thể làm điều đó, nhưng bạn sẽ phải chỉnh sửa quá trình di chuyển đó sau đó để phản ánh đoạn mã trên.
Jaap Haagmans

Có phải: bảng được cho là số nhiều?
mộ

1
@tomb Tôi đã sử dụng ví dụ từ câu hỏi ban đầu. :tablelà tên bảng thực tế, vì vậy trong trường hợp của một usersbảng, bạn muốn thay thế :userscho :table.
Jaap Haagmans 13/09/18

65

Nếu bạn cần tạo một user_idthì sẽ là một giả định hợp lý rằng bạn đang tham chiếu đến một bảng người dùng. Trong trường hợp đó, việc di chuyển sẽ là:

rails generate migration AddUserRefToProducts user:references

Lệnh này sẽ tạo ra quá trình di chuyển sau:

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

Sau khi chạy rake db:migratecả user_idcột và chỉ mục sẽ được thêm vào productsbảng.

Trong trường hợp bạn chỉ cần thêm một chỉ mục vào một cột hiện có, chẳng hạn như namemột userbảng, kỹ thuật sau có thể hữu ích:

rails generate migration AddIndexToUsers name:string:index sẽ tạo ra sự di chuyển sau:

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

Xóa add_columndòng và chạy quá trình di chuyển.

Trong trường hợp được mô tả, bạn có thể đã đưa ra rails generate migration AddIndexIdToTable index_id:integer:indexlệnh và sau đó xóa add_columndòng khỏi di chuyển đã tạo. Nhưng tôi khuyên bạn nên hoàn tác quá trình di chuyển ban đầu và thay vào đó thêm tham chiếu:

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

Cảm ơn Vadym cho câu trả lời đầy đủ. Một câu hỏi cuối cùng: tại sao bạn khuyên bạn nên hoàn tác quá trình di chuyển ban đầu? Có bất kỳ vấn đề hiệu suất nào liên quan đến việc thêm chỉ mục sau này không?
Flavio Wuensche

2
Đối với @fwuensche: không có hình phạt đối với việc thêm chỉ mục sau này. Tuy nhiên, logic miền sẽ ít rõ ràng hơn. Ví dụ như trong trường hợp bạn quyết định để phá vỡ / trừu tượng / etc hiệp hội sau này, bạn sẽ cần phải được đối phó với hai cuộc di cư riêng biệt, mà thực sự cần phải có được một trong những đơn ...
Vadym Tyemirov

6
CẢNH BÁO: Lưu ý rằng chỉ mục: true chỉ hoạt động trong quá trình di chuyển create_table. Quá trình di chuyển sẽ chạy, nhưng không có chỉ mục nào được tạo. Xem makandracards.com/makandra/…
rmcsharry

9

Thêm vào di chuyển đã tạo sau khi tạo cột sau (ví dụ)

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

ý bạn là như sau: def self.up add_column ... end add_index ...?
user1611830

5

Để tham khảo bạn có thể gọi

rails generate migration AddUserIdColumnToTable user:references

Nếu trong tương lai, bạn cần thêm chỉ mục chung, bạn có thể khởi chạy

rails g migration AddOrdinationNumberToTable ordination_number:integer:index

Tạo mã:

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

0

Bạn có thể sử dụng điều này, chỉ cần nghĩ rằng Job là tên của mô hình mà bạn đang thêm index cader_id :

class AddCaderIdToJob < ActiveRecord::Migration[5.2]
  def change
    change_table :jobs do |t|
      t.integer :cader_id
      t.index :cader_id
    end
  end
end
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.