Câu trả lời:
Câu trả lời ngắn cho các phiên bản cũ của Rails (xem các câu trả lời khác cho Rails 4+):
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 các tên cột thay vì một tên cột đơn,
add_index :table_name, [:column_name_a, :column_name_b], unique: true
Nếu bạn nhận được "tên chỉ mục ... quá dài", bạn có thể thêm name: "whatever"
vào phương thức add_index để làm cho tên ngắn hơn.
Để kiểm soát chi tiết, có một execute
phương thức "" thực thi SQL thẳng.
Đó là nó!
Nếu bạn đang làm điều này như một sự thay thế cho các xác nhận mô hình cũ thông thường, hãy kiểm tra xem nó hoạt động như thế nào. Báo cáo lỗi cho người dùng có thể sẽ không đẹp như vậy nếu không có xác nhận ở cấp độ mô hình. Bạn luôn có thể làm cả hai.
indexed columns are not unique
lỗi khi cố gắng tạo một chỉ mục duy nhất, đó có thể là do dữ liệu trong bảng đã chứa các bản sao. Hãy thử xóa dữ liệu trùng lặp và chạy lại di chuyển.
, :name => "whatever"
vào add_index
phương thức để làm cho tên ngắn hơn.
rails tạo di chuyển add_index_to_table_name cột_name: uniq
hoặc là
rails tạo di chuyển add_column_name_to_table_name cột_name: string: uniq: index
tạo ra
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ỉ mục vào một cột hiện có, hãy xóa hoặc nhận xét add_column
dòng hoặc đặt một kiểm tra
add_column :moderators, :username, :string unless column_exists? :moderators, :username
add_index...
và không add_column...
.
Vì điều này chưa được đề cập 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ể chỉ định rằng một chỉ mục 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
(ít nhất là Rails 4.2.7
)
Tôi đang sử dụng Rails 5 và các câu trả lời trên hoạt động rất tốt; Đây là một cách khác cũng hiệu quả với 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
Bạn có thể muốn thêm tên cho khóa duy nhất vì nhiều lần tên unique_key mặc định theo đường ray có thể quá dài mà DB có thể gây ra lỗi.
Để thêm tên cho chỉ mục của bạn, chỉ cần sử dụng name:
tùy chọn. Truy vấn di chuyển có thể trông giố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/ConnectionAd Chap / SchemaStatements / add_index
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 các tên cột thay vì một tên cột đơn.
Nếu bạn đã bỏ lỡ để thêm duy nhất vào cột DB, chỉ cần thêm xác thực này trong mô hình để kiểm tra xem trường này có phải là duy nhất không:
class Person < ActiveRecord::Base
validates_uniqueness_of :user_name
end
tham khảo ở đây Trên đây chỉ dành cho mục đích thử nghiệm, vui lòng thêm chỉ mục bằng cách thay đổi cột DB theo đề xuất của @Nate
vui lòng tham khảo điều này với chỉ mục để biết thêm thông tin