Файл миграции Rails для создания таблицы и добавления уникального индекса в два поля кажется игнорируемым во время миграции

Я здесь совершенно застрял! Я хочу добавить уникальный индекс, чтобы никакие две записи в таблице ассоциаций не могли иметь одинаковую комбинацию user_id и course_id.

Я создал в рельсах следующий файл миграции:

class CreateSignups < ActiveRecord::Migration
  def change

    create_table :signups do |t|

      t.integer :course_id
      t.integer :user_id

      t.timestamps null: false
    end

    add_index :signups, :course_id
    add_index :signups, :user_id
    add_index :signups, [:course_id, :user_id], unique: true

  end
end

... но по какой-то причине уникальный 'course_id & user_id' не представлен в schema.rb, и с помощью консоли rails система позволяет мне вручную создавать несколько записей, в которых course_id и user_id точно такие же.

Таблица регистрации управляется моделью регистрации и имеет целочисленный первичный ключ, называемый id. Таблица модели и базы данных курса и пользователя соответствует стандартному соглашению об именах рельсов.

Может ли кто-нибудь понять, почему в этой миграции не понимаются уникальные критерии?

Заранее спасибо!


person user3535074    schedule 26.04.2015    source источник


Ответы (1)


Вы уже выполнили миграцию один раз (для создания таблицы), а затем добавили индекс? Вы можете проверить это, выполнив следующие действия:

bundle exec rails dbconsole
select * from schema_migrations;

Если ваша версия миграции уже записана в таблице schema_migrations, и выполнение rake db:migrate не запустит ее снова.

Чтобы добавить индексы, у вас есть 2 варианта:

  1. Откат миграцию для CreateSignups. Это приведет к удалению текущей таблицы, а затем выполнение rake db:migrate приведет к повторному созданию таблицы с индексами.

  2. Если вы не хотите терять данные на предыдущем шаге, вам придется явно создать индексы в MySQL из rails dbconsole.

person Utsav Kesharwani    schedule 26.04.2015
comment
Отличный ответ! Да, я думал, что добавление индексов к существующему файлу миграции поможет держать под контролем увеличивающееся количество файлов миграции. Большое спасибо за быстрый, четкий и информативный ответ. - person user3535074; 26.04.2015