Грабли дб: мигрировать не работает
Я работаю через учебник по рельсам и застрял. Начиная с листинга 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 ...
и скопировал код в новый файл, и он запустился.
Я не обнаружил, почему создание этого файла вручную не сработало; все, что я знаю, это то, что "правильный/рельсовый путь" устранил проблему.
Оставьте это здесь, если это поможет кому-то еще.