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

时间:2013-01-31 09:17:04

标签: 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

4 个答案:

答案 0 :(得分:29)

使用Rails 4,您可以提供:index param a 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

答案 1 :(得分:11)

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

答案 2 :(得分:1)

添加:index: { unique: true }

示例:

class AddUsernameToUsers < ActiveRecord::Migration[6.1]
  def change
    add_column :users, :username, :string, null: false, index: { unique: true }
  end
end

enter image description here

答案 3 :(得分:0)

您可以在脚手架中指定唯一索引:

rails generate model Locations city:string:uniq state:string

这将创建模型,规格,工厂以及此迁移:

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

      t.timestamps null: false
    end
    add_index :locations, :city, unique: true
  end
end

Rails知道自己在做什么-不需要任何其他操作。