Рассмотрим случай, когда требуется переименовать класс Rails, который связан с таблицей в БД(модель). Первым шагом, конечно же, правим код и заменяем все встречающиеся совпадения старого имени модели на новое. Не забываем переименовать класс и его файл.
Затем требуется перенести данные из одной таблицы в другую.
При этом можно поступить 2 способами:
1) переименовать таблицу. При этом данные сохранятся, но код работающий со старой моделью работать перестанет.
2) создать новую таблицу, скопировать данные с указанием полей или без из старой таблицы в новую. В этот момент мы имеем и старую и новую модель и старую и новую таблицу. При этом удаление старой таблицы может произойти в следующий релиз. В удобное для нас время удаляем модель и таблицу.
Метод 1. Rename:
rails generate migration RenameOldModelToNewModel
# YYYYMMDDNUMBER_migration.rb
class RenameOldModelToNewModel < ActiveRecord::Migration
def change
rename_table :oldmodels, :newmodels
end
end
где
oldmodels, newmodels - имена таблиц, нужно поменять на свои имена
rake db:migrate
Метод 2.
rails generate migration AddNEWmodel
# YYYYMMDDNUMBER_migration.rb
class AddNEWmodel < ActiveRecord::Migration
def up
create_table :NEWmodels do |t|
t.string :first_field
t.string :second_field
t.timestamps
end
execute 'INSERT INTO NEWmodels SELECT * FROM OLDmodels;'
end
def down
drop_table :NEWmodels
end
end
rake db:migrate
и спустя какое-то время можно удалить старую таблицу:
rails generate migration RemoveOLDmodel
# YYYYMMDDNUMBER_migration.rb
class RemoveOLDmodel < ActiveRecord::Migration
def up
drop_table :OLDmodels
end
def down
create_table :OLDmodels do |t|
t.string :first_field
t.string :second_field
t.timestamps
end
execute 'INSERT INTO OLDmodels SELECT * FROM NEWmodels;'
end
end
rake db:migrate |