Главная » Статьи » Ruby on Rails

Как правильно переименовать модель Rails

Рассмотрим случай, когда требуется переименовать класс 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

Категория: Ruby on Rails | Добавил: iamsimakov (2017-03-16)
Просмотров: 1005 | Теги: Rename, myql, table, RoR, rails | Рейтинг: 0.0/0
Всего комментариев: 0
avatar