428

我不擅长命名,并意识到在我的 Rails 应用程序中有一组更好的模型名称。
有没有办法使用迁移来重命名模型及其对应的表?

4

5 回答 5

609

这是一个例子:

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

我不得不手动重命名模型声明文件。

编辑:

在 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

(您仍然需要手动重命名文件。)

于 2009-01-23T00:29:42.660 回答
76

在 Rails 4 中,我所要做的就是更改 def

def change
  rename_table :old_table_name, :new_table_name
end

我所有的索引都为我处理好了。我不需要通过删除旧索引并添加新索引来手动更新索引。

它也可以使用索引的上升或下降变化来工作。

于 2013-12-17T01:27:55.740 回答
54

其他答案和评论包括表重命名、文件重命名和通过代码查找。

我想补充一些注意事项:

让我们使用我今天遇到的一个真实示例:将模型从“Merchant”重命名为“Business”。

  • 不要忘记在同一迁移中更改依赖表和模型的名称。我同时将 Merchant 和 MerchantStat 模型更改为 Business 和 BusinessStat。否则,在执行搜索和替换时,我不得不做太多的挑选和选择。
  • 对于通过外键依赖于您的模型的任何其他模型,其他表的外键列名称将从您的原始模型名称派生。因此,您还需要对这些依赖模型进行一些 rename_column 调用。例如,我必须在各种连接表(对于 has_and_belongs_to_many 关系)和其他依赖表(对于正常的 has_one 和 has_many 关系)中将“merchant_id”列重命名为“business_id”。否则我最终会得到像“business_stat.merchant_id”这样指向“business.id”的列。这是关于进行列重命名的一个很好的答案。
  • grepping 时,请记住搜索字符串的单数、复数、大写、小写甚至大写(可能出现在注释中)版本。
  • 最好先搜索复数版本,然后再搜索单数。这样,如果您有不规则复数 - 例如在我的商人 :: 企业示例中 - 您可以正确获取所有不规则复数。否则,您最终可能会以“businesss”(3 s)作为中间状态,从而导致更多的搜索和替换。
  • 不要盲目地替换每一次出现。如果您的模型名称与常见的编程术语、其他模型中的值或视图中的文本内容相冲突,您最终可能会过于急切。在我的示例中,我想将模型名称更改为“业务”,但在 UI 的内容中仍将它们称为“商家”。在 CanCan 中,我还为我的用户设置了一个“商人”角色——正是商人角色和商人模型之间的混淆导致我首先重命名了该模型。
于 2012-09-17T20:06:35.990 回答
29

您还需要替换索引:

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 或其他东西定义的其他表中的任何相关列名。您可能还需要编辑它们。

最后,在没有回归测试套件的情况下这样做会很疯狂。

于 2012-12-05T07:30:48.093 回答
1

您可以执行以下命令: rails g migration rename_{old_table_name} to {new_table_name}

编辑文件并在方法更改中添加此代码后

重命名表:{old_table_name},:{new_table_name}

于 2019-09-17T11:11:00.820 回答