Rake db: migrate не работает
Я работаю над учебником по рельсам и застрял. Начиная с листинга 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");
Кажется, что моя миграция еще не запущена, но я не знаю, как заставить ее работать.
Ответы
Ответ 1
Попробуйте перестроить структуру базы данных ( ПРЕДУПРЕЖДЕНИЕ: все данные 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
, чтобы применить пропущенные вами инструкции.
Ответ 2
У меня была такая же проблема, как и исходный вопрос. $ bundle exec rake db:migrate
не добавлял remember_token в .db, и ответ Latha Doddikadi работал у меня.
Я сделал:
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
Ответ 3
Откат, а затем повторная миграция, которая может работать.
rake db:rollback
И после того, как вы вернетесь назад, снова запустите свои миграции.