如何使一个列独一无二,并在Ruby on Rails迁移中对其进行索引?

我想在Ruby on Rails迁移脚本中创build一个unique的列。 什么是最好的办法呢? 还有一种方法来索引表中的列?

我想强制数据库中的unique列,而不是只使用:validate_uniqueness_of

简短的回答:

 add_index :table_name, :column_name, unique: true 

要将多个列索引到一起,需要传递一个列名称数组而不是单个列名称,

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

为了更细粒度的控制,有一个“ execute ”方法,直接执行SQL。

而已!

如果你正在做这个替代旧的模型validation,只需检查它是如何工作的。 我不确定向用户报告的错误会不错。 你总是可以做到这一点。

rails生成迁移add_index_to_table_name column_name:uniq

要么

rails生成迁移add_column_name_to_table_name column_name:string:uniq:index

生成

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

如果要向现有列添加索引,请删除或注释add_column行,或放入一个检查

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

既然这个还没有提到,但是回答了我在find这个页面时遇到的问题,你还可以指定在通过t.referencest.belongs_to添加索引时索引应该是唯一的:

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

(至lessRails 4.2.7

我正在使用Rails 5,上面的答案很好, 这里的另一种方法也适用于我(表名是:people列名是:email_address

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

要将多个列索引在一起,需要传递一个列名称数组,而不是单个列名称。

您可能希望为唯一键添加名称,因为多次使用rails的默认unique_key名称可能会过长,导致数据库可能抛出错误。

要为索引添加名称,只需使用name:选项。 迁移查询可能看起来像这样 –

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

更多信息 – http://apidock.com/rails/ActiveRecord/ConnectionAdapters/SchemaStatements/add_index