2009-09-19 26 views

Trả lời

551

Câu trả lời ngắn:

add_index :table_name, :column_name, unique: true 

Để index nhiều cột với nhau, bạn vượt qua một loạt các tên cột thay vì một tên cột duy nhất,

add_index :table_name, [:column_name_a, :column_name_b], unique: true 

Đối mịn hạt kiểm soát, có một " execute "phương thức thực hiện SQL thẳng.

Vậy đó!

Nếu bạn đang thực hiện việc này để thay thế cho các xác thực mẫu cũ thông thường, chỉ cần kiểm tra xem nó hoạt động như thế nào. Tôi không chắc rằng báo cáo lỗi cho người dùng sẽ tốt đẹp. Bạn luôn có thể làm cả hai.

+33

+1 để đề xuất tiếp tục sử dụng validates_uniqueness_of. Việc xử lý lỗi là sạch hơn nhiều bằng cách sử dụng phương pháp này cho chi phí của một truy vấn chỉ mục duy nhất tôi sẽ đề nghị anh ta làm cả hai –

+1

Tôi đã cố gắng rằng nó không có vẻ để làm việc! Tôi có thể chèn hai bản ghi với column_name mà tôi đã định nghĩa là duy nhất! Tôi đang sử dụng Rails 2.3.4 và MySql bất kỳ ý tưởng? – Tam

+0

Tôi đã sử dụng gợi ý thứ hai của bạn bằng cách sử dụng lệnh thi hành: thực thi "ALTER TABLE users ADD UNIQUE (email)" và nó hoạt động! không chắc chắn lý do tại sao người đầu tiên không quan tâm đến việc biết – Tam

97

ray tạo di cư add_index_to_table_name column_name: uniq

hoặc

ray tạo di cư add_column_name_to_table_name column_name: string: uniq: chỉ số

tạo

class AddIndexToModerators < ActiveRecord::Migration 
    def change 
    add_column :moderators, :username, :string 
    add_index :moderators, :username, unique: true 
    end 
end 

Nếu bạn đang thêm một chỉ số để một cột hiện có, loại bỏ hoặc comment các dòng add_column, hoặc đặt trong một tấm séc

add_column :moderators, :username, :string unless column_exists? :moderators, :username 
+4

Tôi upvoted này bởi vì tôi muốn hình thức dòng lệnh. Nhưng thật ngớ ngẩn khi nó thêm cột ngay cả khi tôi chỉ định 'add_index ...' chứ không phải 'add_column ...'. –

+1

Yeap, có thể trong phiên bản tiếp theo. –

7

Tôi đang sử dụng Rails 5 và các câu trả lời ở trên làm việc lớn; đây là một cách khác mà cũng làm việc cho tôi (tên bảng là :people và tên cột là :email_address)

class AddIndexToEmailAddress < ActiveRecord::Migration[5.0] 
    def change 
    change_table :people do |t| 
     t.index :email_address, unique: true 
    end 
    end 
end 
0

Bạn có thể muốn thêm tên cho khóa duy nhất như nhiều lần so với mặc định unique_key tên gọi theo đường ray thể quá dài mà DB có thể ném lỗi.

Để thêm tên cho chỉ mục của bạn, chỉ cần sử dụng tùy chọn name:. Truy vấn di cư có thể trông như thế này -

add_index :table_name, [:column_name_a, :column_name_b, ... :column_name_n], unique: true, name: 'my_custom_index_name'

Thông tin thêm - http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index

17

Vì đây đã không được đề cập được nêu ra nhưng trả lời câu hỏi tôi đã có khi tôi tìm thấy trang này, bạn cũng có thể xác định rằng một chỉ số phải là duy nhất khi thêm nó qua t.references hoặc t.belongs_to:

create_table :accounts do |t| 
    t.references :user, index: { unique: true } # or t.belongs_to 

    # other columns... 
end 

(như ít nhất Rails 4.2.7)

1
add_index :table_name, :column_name, unique: true 

Để lập chỉ mục nhiều cột với nhau, bạn chuyển một mảng tên cột thay vì tên cột duy nhất.

Các vấn đề liên quan