Как вы пишете миграцию для переименования модели ActiveRecord и ее таблицы в Rails? - PullRequest
392 голосов
/ 23 января 2009

Я ужасно разбираюсь в названиях и понимаю, что в моем приложении Rails есть лучший набор имен для моих моделей.
Есть ли способ использовать миграцию для переименования модели и соответствующей ей таблицы?

Ответы [ 4 ]

564 голосов
/ 23 января 2009

Вот пример:

class RenameOldTableToNewTable < ActiveRecord::Migration
  def self.up
    rename_table :old_table_name, :new_table_name
  end

  def self.down
    rename_table :new_table_name, :old_table_name
  end
end

Мне пришлось вручную переименовать файл объявления модели.

Edit:

В Rails 3.1 & 4 ActiveRecord::Migration::CommandRecorder знает, как отменить миграцию rename_table, поэтому вы можете сделать это:

class RenameOldTableToNewTable < ActiveRecord::Migration
  def change
    rename_table :old_table_name, :new_table_name
  end 
end

(Вам все еще нужно пройти и вручную переименовать файлы.)

62 голосов
/ 17 декабря 2013

В Rails 4 все, что мне нужно было сделать, это изменить определение

def change
  rename_table :old_table_name, :new_table_name
end

И обо всех моих индексах позаботились обо мне. Мне не нужно было обновлять индексы вручную, удаляя старые и добавляя новые.

И это работает, используя изменение для повышения или понижения в отношении индексов.

45 голосов
/ 18 сентября 2012

Другие ответы и комментарии касались переименования таблиц, переименования файлов и просмотра вашего кода.

Я хотел бы добавить еще несколько предостережений:

Давайте рассмотрим реальный пример, с которым я столкнулся сегодня: переименование модели из «Торговца» в «Бизнес».

  • Не забудьте изменить имена зависимых таблиц и моделей в та же миграция. Я изменил свои модели Merchant и MerchantStat на Business и BusinessStat одновременно. В противном случае мне пришлось бы слишком много выбирать и выбирать при выполнении поиска и замены.
  • Для любых других моделей, которые зависят от вашей модели через внешние ключи, имена столбцов внешних ключей других таблиц будут получены из вашего исходного имени модели. Поэтому вы также захотите сделать несколько вызовов rename_column для этих зависимых моделей. Например, мне пришлось переименовать столбец 'merchant_id' в 'business_id' в различных таблицах соединения (для отношений has_and_belongs_to_many) и других зависимых таблицах (для обычных отношений has_one и has_many). В противном случае я бы получил столбцы типа business_stat.merchant_id, указывающие на business.id. Вот хороший ответ по поводу переименования столбцов.
  • При подборе текста не забывайте искать в единственном, множественном числе, с большой буквы, версии в нижнем регистре и даже в верхнем регистре (что может встречаться в комментариях) из ваших строк.
  • Лучше всего сначала искать варианты во множественном числе, а затем в единственном числе. Тот Кстати, если у вас неправильное множественное число - например, у моих торговцев: пример бизнеса - вы можете получить все неправильные множественные числа правильно. В противном случае вы можете получить, например, «businesss» (3 с) в качестве промежуточное состояние, что приводит к еще большему количеству операций поиска и замены.
  • Не заменяйте вслепую каждое происшествие. Если названия вашей модели сталкиваются с общими терминами программирования, со значениями в других моделях или с текстовое содержание в ваших взглядах, вы можете оказаться слишком увлечены. В моем примере я хотел изменить название модели на «Бизнес», но все еще называют их «торговцами» в контенте в моем интерфейсе. У меня также была роль «продавца» для моих пользователей в CanCan - именно путаница между ролью продавца и моделью «Торговец» заставила меня переименовать модель.
23 голосов
/ 05 декабря 2012

Вам также нужно заменить свои индексы:

class RenameOldTableToNewTable< ActiveRecord:Migration
  def self.up
    remove_index :old_table_name, :column_name
    rename_table :old_table_name, :new_table_name
    add_index :new_table_name, :column_name
  end 

  def self.down
    remove_index :new_table_name, :column_name
    rename_table :new_table_name, :old_table_name
    add_index :old_table_name, :column_name
  end
end

И переименуйте свои файлы и т. Д. Вручную, как описано в других ответах.

См .: http://api.rubyonrails.org/classes/ActiveRecord/Migration.html

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

Кроме того: проверьте schema_db для любых соответствующих имен столбцов в других таблицах, определенных has_ ​​или own_to или чем-то еще. Вам, вероятно, придется их редактировать.

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

...