18

尽管我的应用程序不允许用户键入位置,但我想强制数据库中城市的唯一性。由于我的 Rails 应用程序将在 city 列上进行搜索,因此我也想在 city 列上添加一个索引,但想知道在索引上添加 unique: 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

4 回答 4

33

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

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
于 2015-04-26T22:01:21.847 回答
13

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

于 2013-01-31T10:10:31.700 回答
3

您可以在搭建脚手架时指定唯一索引:

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 知道它在做什么——不需要更多。

于 2018-06-23T20:10:25.640 回答
3

添加:index: { unique: true }

例子:

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

在此处输入图像描述

于 2021-03-18T21:48:34.517 回答