Как создать новую таблицу с уникальным индексом в 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)