Answers:
旧版Rails的简短答案(请参见Rails 4+的其他答案):
add_index :table_name, :column_name, unique: true
要将多个列一起建立索引,您可以传递一个列名数组,而不是单个列名,
add_index :table_name, [:column_name_a, :column_name_b], unique: true
如果收到“索引名称...太长”,则可以添加name: "whatever"
到add_index方法中以使名称更短。
对于细粒度的控制,有一个“ execute
”方法可以执行直接的SQL。
而已!
如果要代替常规的旧模型验证来执行此操作,请检查其工作原理。如果没有模型级别的验证,向用户报告错误的情况可能会不太好。两者都可以。
indexed columns are not unique
在尝试创建唯一索引时遇到错误,则可能是因为表中的数据已经包含重复项。尝试删除重复的数据,然后再次运行迁移。
, :name => "whatever"
到add_index
方法中以使名称更短。
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
add_index...
没有指定也添加列,这是很愚蠢的add_column...
。
由于这尚未提及,但回答我时,我找到了这个网页的问题,你也可以指定通过加时,它的指数应该是唯一的t.references
或t.belongs_to
:
create_table :accounts do |t|
t.references :user, index: { unique: true } # or t.belongs_to
# other columns...
end
(至少从Rails开始4.2.7
)
您可能想为唯一键添加名称,因为默认情况下,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
如果您错过了向数据库添加唯一列,只需在模型中添加此验证即可检查该字段是否唯一:
class Person < ActiveRecord::Base
validates_uniqueness_of :user_name
end
请参阅此处 上面仅用于测试目的,请按照@Nate的建议通过更改数据库列来添加索引
请参考索引以获取更多信息