Как написать миграцию для переименования модели ActiveRecord и ее таблицы в Rails?

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

4 ответов


вот пример:

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

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


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

def change
  rename_table :old_table_name, :new_table_name
end

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

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


другие ответы и комментарии охватывают переименование таблиц, переименование файлов и grepping через ваш код.

Я хотел бы добавить еще несколько моментов:

давайте используем реальный пример, с которым я столкнулся сегодня: переименование модели из "торговца" в "бизнес".'

  • Не забудьте изменить имена зависимых таблиц и моделей в та же миграция. Я изменил свои модели Merchant и MerchantStat на Business и BusinessStat одновременно. Иначе я бы пришлось сделать слишком много выбора и выбора при выполнении поиска и замены.
  • для любых других моделей, которые зависят от вашей модели через внешние ключи, имена столбцов внешнего ключа других таблиц будут получены из вашего исходного имени модели. Таким образом, вы также захотите выполнить некоторые вызовы rename_column для этих зависимых моделей. Например, мне пришлось переименовать столбец "merchant_id" в "business_id" в различных таблицах соединений (для отношения has_and_belongs_to_many) и других зависимых таблиц (для нормальных отношений has_one и has_many). В противном случае я бы закончил с такими столбцами, как " business_stat.merchant_id "указывает на" бизнес.id. вот хороший ответ о переименовании столбцов.
  • когда применение grep к, помните, искать единственное, множественное, капитализируются, строчные и даже прописные (которые могут встречаться в комментариях) версии твоих струн.
  • лучше всего сначала искать множественное число, а затем единственное число. Что путь если вы имеете неправильное множественное число-как у моих купцов :: пример бизнеса - вы можете получить все неправильное множество правильно. В противном случае вы можете получить, например, 'businesss' (3 s) в качестве промежуточное состояние, приводящее к еще большему поиску и замене.
  • Не заменяйте слепо каждое событие. Если ваши имена моделей сталкиваются с общими терминами программирования, со значениями в других моделях, или с текстовое содержание в ваших взглядах вы можете оказаться слишком нетерпеливым. В моем примере я хотел изменить имя модели на "бизнес", но все еще ссылаются на них как на "продавцов" в содержимом моего пользовательского интерфейса. У меня также была роль "торговца" для моих пользователей в канкане - это была путаница между ролью торговца и моделью торговца, которая заставила меня переименовать модель в первую очередь.

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

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_ или belongs_to или чем-то еще. Вам, вероятно, придется отредактировать их тоже.

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