我想在Ruby on Rails迁移脚本中创建一个列unique
。最好的方法是什么?还有一种方法可以索引表中的列吗?
我想在数据库中强制执行unique
列,而不是仅使用:validate_uniqueness_of
。
答案 0 :(得分:629)
答案简短:
add_index :table_name, :column_name, unique: true
要将多个列索引在一起,可以传递一组列名而不是一个列名
add_index :table_name, [:column_name_a, :column_name_b], unique: true
对于更细粒度的控制,有一个“execute
”方法可以执行直接SQL。
就是这样!
如果您要将其作为常规旧模型验证的替代品,请检查其工作原理。我不确定向用户报告的错误是否会很好。你可以随时做到这两点。
答案 1 :(得分:115)
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
答案 2 :(得分:38)
由于尚未提及此问题但回答了我在找到此页面时遇到的问题,您还可以指定在通过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
)
答案 3 :(得分:24)
如果要创建新表,可以使用内联快捷方式:
def change
create_table :posts do |t|
t.string :title, null: false, index: { unique: true }
t.timestamps
end
end
答案 4 :(得分:12)
我使用Rails 5并且上述答案效果很好;这是另一种对我有用的方式(表名为redux-thunk
,列名为public static void main(String[] args){}
)
:people
答案 5 :(得分:1)
add_index :table_name, :column_name, unique: true
要将多个列索引在一起,可以传递一组列名而不是一个列名。
答案 6 :(得分:0)
您可能希望为唯一键添加名称,因为rails的默认unique_key名称可能太长,因此DB可能会抛出错误。
要为索引添加名称,请使用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
答案 7 :(得分:0)
如果您想为数据库列添加唯一性,只需在模型中添加此验证即可检查该字段是否唯一:
class Person < ActiveRecord::Base
validates_uniqueness_of :user_name
end
refer here 上面仅用于测试目的,请按照@Nate的建议通过更改数据库列来添加索引
请参阅此with index以获取更多信息