Итак, я пытался создать индекс базы данных в столбце электронной почты модели Users, но, должно быть, что-то делаю неправильно, поскольку после выполнения миграции я иду и проверяю файл schema.rb, чтобы узнать, включен ли метод add_index и ничего не появляется. Кстати, я использую postgresql . Итак, вот что я сделал ... Я создал миграцию

rails generate migration add_index_to_users_email

После этого я отредактировал и сохранил файл db / migrate / 20140911192804_add_index_to_users_email.rb со следующим кодом для индексации:

class AddIndexToUsersEmail < ActiveRecord::Migration
  def change
    add_index :users, :email, unique: true
  end
end

После этого я запустил консоль

bundle exec rake db:migrate

И когда я пошел проверить файл schema.rb, чтобы увидеть, включен ли метод add_index, я обнаружил, что его там нет. Вот как выглядел мой schema.rb

ActiveRecord::Schema.define(version: 20140911192804) do

  # These are extensions that must be enabled in order to support this database
  enable_extension "plpgsql"

  create_table "users", force: true do |t|
    t.string   "name"
    t.string   "email"
    t.datetime "created_at"
    t.datetime "updated_at"
  end

end

Я попытался запустить rake db: rollback для повторного запуска db: migrate и посмотреть, произошло ли какое-то «волшебство», но я даже не смог выполнить откат, получив это сообщение об ошибке:

   ==  AddIndexToUsersEmail: reverting ===========================================
-- remove_index(:users, {:unique=>true, :column=>:email})
  ←[1m←[35m (0.0ms)←[0m  ROLLBACK
rake aborted!
An error has occurred, this and all later migrations canceled:

Index name 'index_users_on_email' on table 'users' does not existC:in `migrate'
Tasks: TOP => db:rollback

Я очень заблудился ... кое-что мне показалось интересным, так это то, что в файле schema.rb эта строка

ActiveRecord::Schema.define(version: 20140911192804) do

Имел ту же метку времени, что и файл миграции для add_index db / migrate / 20140911192804_add_index_to_users_email.rb

Таким образом, во время миграции произошло какое-то обновление в файле schema.rb, но не то, что я ожидал.

Я даже не знаю, с чего начать: D, поэтому я надеюсь, что кто-то более опытный сможет мне подсказать.

Спасибо!

0
santib 12 Сен 2014 в 00:58

2 ответа

Лучший ответ

После нескольких часов проб и ошибок я наконец нашел решение!

По какой-то непонятной мне причине миграция не добавила метод add_index в мой schema.rb, однако, когда я попытался выполнить откат, он искал индекс в таблице пользователей, которого не было, поэтому откат продолжался.

Я предположил, что информация об индексе, который он должен был искать в таблице, была в файле миграции. Поэтому я удалил содержимое файла миграции, оставив его так:

class AddIndexToUsersEmail < ActiveRecord::Migration
  def change
  end
end

Наконец-то я смог откатиться.

Затем я снова набрал содержимое файла миграции AddIndexToUsersEmail.

class AddIndexToUsersEmail < ActiveRecord::Migration
  def change
    add_index :users, :email, unique: true
  end
end

Я снова запустил пакет exec rake db: migrate, и он сработал! : D

Большое спасибо всем, кто нашел время прочитать этот выпуск!

0
santib 12 Сен 2014 в 05:23

У меня была такая же проблема, и я понял, почему !!!

Вы (мы) использовали команду migrate перед сохранением файла миграции !! Так что миграция прошла без ничего внутри. Просто метод изменения без инструкций.

И если после попытки отката файл миграции сохранился с тех пор. Инструкция add_index находится внутри, поэтому откат невозможен.

Надеюсь, я достаточно ясен.

0
bobix 24 Ноя 2015 в 13:32