为Active Record中的add_column和add_index添加唯一:true

Ric*_*men 13 ruby-on-rails rails-activerecord

即使我的应用程序不允许用户键入某个位置,我也希望在数据库中强制执行城市的唯一性.由于我的Rails应用程序将在city列上搜索,我想在city列上添加一个索引,但是想知道是否重要的​​是添加唯一:true也在索引上.这是重复吗?如果这没有意义,如果你能解释原因,我将非常感激.

class CreateLocations < ActiveRecord::Migration
  def change
    create_table :locations do |t|
      t.string :city, unique: true
      t.string :state

      t.timestamps
    end

    add_index :locations, :city, unique: true
  end
end
Run Code Online (Sandbox Code Playgroud)

小智 30

使用Rails 4,您可以提供:index param hash参数

class CreateLocations < ActiveRecord::Migration
  def change
    create_table :locations do |t|
      t.string :city, index: {unique: true}
      t.string :state

      t.timestamps
    end
  end
end
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这仅适用于 `create_table`,不适用于 `add_column`。当您使用 `add_column` 并想添加索引时,您必须单独使用 `add_index`。在此处查看 arthurnn 的最后一条评论:https://github.com/rails/rails/pull/20616#issuecomment-144870870 (2认同)

Jiř*_*šil 11

据我所知,实际上不支持块中的unique选项create_table并且不执行任何操作,请参阅TableDefinition.要创建唯一索引,您需要按照add_index现在的方式调用该方法.请注意,唯一索引既用于唯一性又用于搜索等,不需要在同一列上添加两个索引.


Axe*_*che 5

添加:index: { unique: true }

例子:

class AddUsernameToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :username, :string, null: false, index: { unique: true }
  end
end
Run Code Online (Sandbox Code Playgroud)

在此输入图像描述