我想在Ruby on Rails迁移脚本中创建一个 unique 列 . 最好的方法是什么?还有一种方法可以索引表中的列吗?
unique
我想在数据库中强制执行 unique 列,而不是仅使用 :validate_uniqueness_of .
:validate_uniqueness_of
简短的回答:
add_index :table_name, :column_name, unique: true
要将多个列索引在一起,可以传递一组列名而不是一个列名,
add_index :table_name, [:column_name_a, :column_name_b], unique: true
对于更精细的控制,有一个执行直接SQL的“ execute ”方法 .
execute
而已!
如果您这样做是为了替代常规的旧模型验证,只需检查它是如何工作的 . 我不确定向用户报告的错误是否会很好 . 你可以随时做到这两点 .
rails生成迁移add_index_to_table_name column_name:uniq
要么
rails generate migration 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
add_column :moderators, :username, :string unless column_exists? :moderators, :username
由于尚未提及但回答了我在找到此页面时遇到的问题,您还可以指定索引在通过 t.references 或 t.belongs_to 添加时应该是唯一的:
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 )
4.2.7
如果要创建新表,可以使用内联快捷方式:
def change create_table :posts do |t| t.string :title, null: false, index: { unique: true } t.timestamps end end
我'm using Rails 5 and the above answers work great; here'另一种对我有用的方法(表名是 :people ,列名是 :email_address )
: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
要将多个列索引在一起,可以传递一组列名而不是一个列名 .
您可能希望为唯一键添加名称,因为rails的默认unique_key名称可能太长,DB可能会抛出错误 .
要为索引添加名称,只需使用 name: 选项 . 迁移查询可能看起来像这样 -
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 回答
简短的回答:
要将多个列索引在一起,可以传递一组列名而不是一个列名,
对于更精细的控制,有一个执行直接SQL的“
execute
”方法 .而已!
如果您这样做是为了替代常规的旧模型验证,只需检查它是如何工作的 . 我不确定向用户报告的错误是否会很好 . 你可以随时做到这两点 .
要么
生成
如果要向现有列添加索引,请删除或注释
add_column
行,或进行检查由于尚未提及但回答了我在找到此页面时遇到的问题,您还可以指定索引在通过
t.references
或t.belongs_to
添加时应该是唯一的:(截至至少Rails
4.2.7
)如果要创建新表,可以使用内联快捷方式:
我'm using Rails 5 and the above answers work great; here'另一种对我有用的方法(表名是
:people
,列名是:email_address
)要将多个列索引在一起,可以传递一组列名而不是一个列名 .
您可能希望为唯一键添加名称,因为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