Rails создает миграцию add_index_to... не помещает фактический индекс в файл миграции
Я создал таблицу пользователей через "rails generate model User name: string email: string..." также был создан файл миграции.
class CreateUsers < ActiveRecord::Migration
def change
create_table :users do |t|
t.string :name
t.string :email
t.timestamps
end
end
end
Теперь я хочу добавить индекс в столбец электронной почты "после учебника". Я сделал это успешно в первый раз, используя sqlite3. Второй раз через im, используя MySql (mysql2). Снова создала таблицу с генерацией модели. Когда я запускаю следующее:
rails generate migration add_index_to_users_email
процесс заканчивается без сообщения об ошибке и создает файл миграции, как показано ниже, но нет никакого индекса.
class AddIndexToUsersEmail < ActiveRecord::Migration
def change
end
end
Я ожидаю увидеть add_index :users, :email, unique: true
там... У кого-нибудь есть идеи.. искали другие потоки безрезультатно.. running rails 4, mysql 5.6 ruby 1.9.3 моя схема, которая была создана после initil db: migrate is
ActiveRecord::Schema.define(version: 20131024161033) do
create_table "users", force: true do |t|
t.string "name"
t.string "email"
t.string "city"
t.string "state"
t.string "zip"
t.string "mobile_phone"
t.string "mobile_phone_type"
t.date "birth_date"
t.string "user_type"
t.string "ss_num"
t.boolean "agree_to_terms"
t.datetime "created_at"
t.datetime "updated_at"
end
end
Ответы
Ответ 1
через http://guides.rubyonrails.org/migrations.html
Если вы хотите добавить индекс для нового столбца, вы также можете сделать это:
$ rails генерирует миграцию AddPartNumberToProducts part_number: string: index
ваш генератор
rails generate migration add_index_to_users_email
просто создает пустой файл миграции и не описывает индекс
так что это было бы более уместно...
rails generate migration AddIndexToUsers email:string:index
должен дать вам
class AddIndexToUsers < ActiveRecord::Migration
def change
add_index :users, :email
end
end
Нгуен Ю - РЕДАКТИРОВАТЬ
Эта команда [Rails 5.2.3]
rails generate migration AddIndexToUsers email:string:index
на самом деле даст вам
class AddIndexToUsers < ActiveRecord::Migration[5.2]
def change
add_column :users, :email, :string
add_index :users, :email
end
end
не только add_index
но также add_column
в таблицу пользователей.
Ответ 2
rails generate migration AddIndexToUsers email:string:index
если у вас уже есть столбец, просто добавьте индекс, например:
class AddIndexToUsers < ActiveRecord::Migration
def change
add_index :users, :email
end
end
если вы создаете новый столбец (у вас еще нет столбца в базе данных), он возвращает:
class AddIndexToUsers < ActiveRecord::Migration
def change
add_column :user, :email, :string
add_index :users, :email
end
end
Ответ 3
Из http://railstutorial.ru/chapters/4_0/modeling-users#code-email_uniqueness_index.
Перенос уникальности электронной почты не задан заранее, поэтому нам нужно заполнить его содержимым этим путем: "add_index: users,: email, unique: true".
Результат будет:
class AddIndexToUsersEmail < ActiveRecord::Migration
def change
add_index :users, :email, unique: true
end
end