#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. Должно быть нормально оставить все как есть, похоже, вы явно не вызываете это в своей миграции.