How do I make a column unique and index it in a Ruby on Rails migration?
 I would like to make a column unique in Ruby on Rails migration script.  What is the best way to do it?  Also is there a way to index a column in a table?  
 I would like to enforce unique columns in a database as opposed to just using :validate_uniqueness_of .  
The short answer:
add_index :table_name, :column_name, unique: true
To index multiple columns together, you pass an array of column names instead of a single column name,
add_index :table_name, [:column_name_a, :column_name_b], unique: true
 For finer grained control, there's a " execute " method that executes straight SQL.  
That's it!
If you are doing this as a replacement for regular old model validations, just check to see how it works. I'm not sure the error reporting to the user will be as nice. You can always do both.
rails generate migration add_index_to_table_name column_name:uniq
or
rails generate migration add_column_name_to_table_name column_name:string:uniq:index
generates
class AddIndexToModerators < ActiveRecord::Migration
  def change
    add_column :moderators, :username, :string
    add_index :moderators, :username, unique: true
  end
end
 If you're adding an index to an existing column, remove or comment the add_column line, or put in a check  
add_column :moderators, :username, :string unless column_exists? :moderators, :username
 Since this hasn't been mentioned yet but answers the question I had when I found this page, you can also specify that an index should be unique when adding it via t.references or t.belongs_to :  
create_table :accounts do |t|
  t.references :user, index: { unique: true } # or t.belongs_to
  # other columns...
end
 (as of at least Rails 4.2.7 )  
上一篇: Rails迁移更改列
