Обновлена миграция rails3, но результаты не отображаются после rake: db migrate

#mysql #ruby-on-rails #ruby-on-rails-3 #devise #rails-migrations

#mysql #ruby-on-rails #ruby-on-rails-3 #разработать #rails-миграции

Вопрос:

Я работаю с файлом миграции Devise. Изначально это было так:

 class DeviseCreateUsers < ActiveRecord::Migration
  def self.up
    create_table(:users) do |t|
      t.database_authenticatable :null => false
      t.recoverable
      t.rememberable
      t.trackable

      # t.encryptable
      # t.confirmable
      # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
      # t.token_authenticatable


      t.timestamps
    end

    add_index :users, :email,                :unique => true
    add_index :users, :reset_password_token, :unique => true
    # add_index :users, :confirmation_token,   :unique => true
    # add_index :users, :unlock_token,         :unique => true
    # add_index :users, :authentication_token, :unique => true
  end

  def self.down
    drop_table :users
  end
end
  

Я хотел добавить 3 столбца, подобных этому:

t.first_name t.last_name t.organization_name

Итак, мой файл миграции выглядел следующим образом, как только я внес изменения:

 class DeviseCreateUsers < ActiveRecord::Migration
  def self.up
    create_table(:users) do |t|
      t.database_authenticatable :null => false
      t.recoverable
      t.rememberable
      t.trackable
      t.first_name
      t.last_name
      t.organization_name
      # t.encryptable
      # t.confirmable
      # t.lockable :lock_strategy => :failed_attempts, :unlock_strategy => :both
      # t.token_authenticatable


      t.timestamps
    end

    add_index :users, :email,                :unique => true
    add_index :users, :reset_password_token, :unique => true
    # add_index :users, :confirmation_token,   :unique => true
    # add_index :users, :unlock_token,         :unique => true
    # add_index :users, :authentication_token, :unique => true
  end

  def self.down
    drop_table :users
  end
end
  

Затем из командной строки я выполнил эту команду:

 rake db:migrate
  

И результирующая таблица db не отражала столбцы, которые я пытался добавить. Вот как это выглядит:

 describe users;
 ------------------------ -------------- ------ ----- --------- ---------------- 
| Field                  | Type         | Null | Key | Default | Extra          |
 ------------------------ -------------- ------ ----- --------- ---------------- 
| id                     | int(11)      | NO   | PRI | NULL    | auto_increment |
| email                  | varchar(255) | NO   | UNI |         |                |
| encrypted_password     | varchar(128) | NO   |     |         |                |
| reset_password_token   | varchar(255) | YES  | UNI | NULL    |                |
| reset_password_sent_at | datetime     | YES  |     | NULL    |                |
| remember_created_at    | datetime     | YES  |     | NULL    |                |
| sign_in_count          | int(11)      | YES  |     | 0       |                |
| current_sign_in_at     | datetime     | YES  |     | NULL    |                |
| last_sign_in_at        | datetime     | YES  |     | NULL    |                |
| current_sign_in_ip     | varchar(255) | YES  |     | NULL    |                |
| last_sign_in_ip        | varchar(255) | YES  |     | NULL    |                |
| created_at             | datetime     | YES  |     | NULL    |                |
| updated_at             | datetime     | YES  |     | NULL    |                |
 ------------------------ -------------- ------ ----- --------- ---------------- 
  

Есть идеи, почему мои попытки внести изменения не отображаются? Как мне принудительно выполнить изменения?

Спасибо!!

Ответ №1:

Исправьте ваш файл миграции, в нем есть некоторые ошибки:

 ...
t.first_name
t.last_name
t.organization_name
...
  

Измените это следующим образом:

 ...
t.string :first_name
t.string :last_name
t.string :organization_name
...
  

Вы можете проверить Руководство по миграции для получения дополнительной информации.

После этих изменений, если таблица users не существует, вы можете сделать rake db:migrate ; если она существует, сделайте rake db:migrate:redo .

Кстати, вам лучше использовать другую миграцию для добавления / удаления / изменения столбцов в ваших таблицах.

Ответ №2:

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

Если вы уже запускали эту миграцию, она больше не будет выполняться с использованием rake db:migrate , поскольку будут запущены только более новые миграции, чем версия схемы.

Чтобы снова запустить последнюю миграцию, вы можете сделать rake db:migrate:redo

Комментарии:

1. Повторное выполнение выдало эту ошибку: rake прерван! Произошла ошибка, все последующие миграции отменены: неопределенный метод `first_name’ для #<ActiveRecord::ConnectionAdapters::TableDefinition:0x925bc88>

2. Я также добавил это:first_name, : last_name, :organization_name в мой файл users.rb, но, похоже, это не помогло.

3. Похоже, вам было бы лучше перенести все ваши изменения в миграцию, перенести ее вручную rake db:migrate:down VERSION=nnnnnnnnnnnn , повторно применить ваши изменения и выполнить миграцию как обычно. Как правило, менять миграции не очень хорошая идея, лучше просто внести изменения в базу данных в новой.

4. Спасибо. Что насчет файла users.rb? Должен ли я был это изменить? И должен ли я изменить его обратно во время миграции вниз?

5. Должно быть нормально оставить все как есть, похоже, вы явно не вызываете это в своей миграции.