Подтвердить что ты не робот

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");

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

4b9b3361

Ответ 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

И после того, как вы вернетесь назад, снова запустите свои миграции.