Как создать новую таблицу с уникальным индексом в Active Record/Rails 4 Migration

Как создать новую таблицу с помощью миграции рельсов и добавить к ней уникальный индекс?

В документах я нашел, как добавить индекс в таблицу после его создания, но как вы это делаете: создайте таблицу и добавьте уникальный индекс - в тот же файл миграции?

Ответы

Ответ 1

Здесь полный процесс:

Создать миграцию (rails generate migration CreateFoos bar:string)

Измените свою миграцию, чтобы выглядеть примерно так:

class CreateFoos < ActiveRecord::Migration
  def change
    create_table :foos do |t|
      t.string :bar, :null => false

      t.index :bar, unique: true
    end
  end
end

Выполнить rake db:migrate

Ответ 2

Более компактный способ:

class CreateFoobars < ActiveRecord::Migration
  def change
    create_table :foobars do |t|
      t.string :name, index: {unique: true}
    end
  end
end

Ответ 3

После создания миграции rails generate migration CreateBoards name:string description:string

В файле миграции добавьте индекс, как показано ниже:

class CreateBoards < ActiveRecord::Migration
  def change
   create_table :boards do |t|
     t.string :name
     t.string :description

     t.timestamps
   end

   add_index :boards, :name, unique: true

 end
end

Ответ 4

Вы можете создать таблицу и индекс с генератором без изменения файла миграции

Для уникального индекса

rails generate model CreateFoos bar:string:uniq

Для неидеального индекса

rails generate model CreateFoos bar:string:index

Ответ 5

В Rails 5 вы можете предоставить параметры индекса вместе с определением столбца.

create_table :table_name do |t|
  t.string :key, null: false, index: {unique: true}
  t.jsonb :value

  t.timestamps
end


Column   |            Type             | Collation | Nullable |                 Default
------------+-----------------------------+-----------+----------+-----------------------------------------
id         | bigint                      |           | not null | nextval('table_name_id_seq'::regclass)
key        | character varying           |           | not null |
value      | jsonb                       |           |          |
created_at | timestamp without time zone |           | not null |
updated_at | timestamp without time zone |           | not null |
Indexes:
  "table_name_pkey" PRIMARY KEY, btree (id)
  "index_table_name_on_key" UNIQUE, btree (key)