Грабли дб: мигрировать не работает

Я работаю через учебник по рельсам и застрял. Начиная с листинга 8.16, я внес следующие изменения в <timestamp>_add_remember_token_to_users.rb:

class AddRememberTokenToUsers < ActiveRecord::Migration
  def change
    add_column :users, :remember_token, :string
    add_index  :users, :remember_token
  end
end

Затем руководство говорит, что нужно обновить dev & test db как обычно:

$ bundle exec rake db:migrate
$ bundle exec rake db:test:prepare

Мой пользовательский тест для * Remember_token* все еще не проходит, поэтому я посмотрел на пользовательскую таблицу в dev и проверил базу данных с помощью командной строки sqlite3. Они выглядят так:

sqlite> .schema users
CREATE TABLE "users" (
   "id" INTEGER PRIMARY KEY AUTOINCREMENT NOT NULL, 
   "name" varchar(255), 
   "email" varchar(255), 
   "created_at" datetime NOT NULL, 
   "updated_at" datetime NOT NULL, 
   "password_digest" varchar(255));
CREATE UNIQUE INDEX "index_users_on_email" ON "users" ("email");

Похоже, моя миграция еще не запущена, но я не знаю, как заставить ее работать.

4 ответа

Решение

Попробуйте перестроить структуру вашей базы данных (ВНИМАНИЕ: все db-данные будут потеряны):

rake db:drop:all
rake db:create:all
rake db:migrate

Если вы используете Rails < 4.1, не забудьте подготовить тестовую базу данных:

rake db:test:prepare

Это самое простое решение, так как вы работаете с учебником. Однако в процессе производства или при наличии важных данных в разработке вы должны уделить время изучению проблемы. В этом случае вы, скорее всего, создали пустую миграцию, запустили rake db:migrate, а затем добавил инструкции к миграции, чтобы вы не увидели новое поле и далее rake db:migrate ничего не делает. Чтобы решить эту проблему, вы должны прокомментировать change инструкции, выполнить rake db:rollback, раскомментируйте инструкции, а затем rake db:migrate применять инструкции, которые вы пропустили.

У меня была та же проблема, что и в первоначальном вопросе. $ bundle exec rake db:migrate Я не добавлял Remember_token в.db, и ответ Латы Доддикади мне помог.

Я сделал:

rake db:rollback

а потом:

$ bundle exec rake db:migrate

который добавил поле базы данных Remember_token, а затем:

bundle exec rspec spec/models/user_spec.rb

который прошел.

Finished in 0.92841 seconds
21 examples, 0 failures

Откатитесь, а затем снова запустите миграцию.

     rake db:rollback

И после отката снова запустите ваши миграции.

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

      rails g migration ...

и скопировал код в новый файл, и он запустился.

Я не обнаружил, почему создание этого файла вручную не сработало; все, что я знаю, это то, что "правильный/рельсовый путь" устранил проблему.

Оставьте это здесь, если это поможет кому-то еще.

Другие вопросы по тегам