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