如何使列惟一并在Ruby on Rails迁移中将其编入索引?

我想在Ruby on Rails迁移脚本中建立一个unique的列。 最好的方法是什么? 还有一种方法能够索引表中的列吗? 数据库

我想在数据库中强制使用unique列,而不是仅使用:validate_uniqueness_ofapi


#1楼

简短的回答: less

add_index :table_name, :column_name, unique: true

要将多个列索引在一块儿,能够传递一组列名而不是一个列名, spa

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

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

而已! 索引

若是您这样作是为了替代常规的旧模型验证,只需检查它是如何工做的。 我不肯定向用户报告的错误是否会很好。 你能够随时作到这两点。 get


#2楼

rails生成迁移add_index_to_table_name column_name:uniq string

要么 io

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

生成

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

#3楼

我正在使用Rails 5,上面的答案颇有用; 这是另外一种对我: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

#4楼

您可能但愿为惟一键添加名称,由于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


#5楼

因为还没有说起但回答了我在找到此页面时遇到的问题,您还能够指定索引在经过t.referencest.belongs_to添加时应该是惟一的:

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

  # other columns...
end

(截至至少Rails 4.2.7

相关文章
相关标签/搜索