How do you write a migration to rename an ActiveRecord model and its table in Rails?
我在命名时很糟糕,并且意识到我的Rails应用程序中的模型有更好的名称。 有没有办法使用迁移来重命名模型及其相应的表?
这是一个例子:
1 2 3 4 5 6 7 8 9 | 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&amp; 4,
1 2 3 4 5 | class RenameOldTableToNewTable < ActiveRecord::Migration def change rename_table :old_table_name, :new_table_name end end |
(您仍然需要通过手动重命名文件。)
在Rails 4中,我所要做的只是改变
1 2 3 | def change rename_table :old_table_name, :new_table_name end |
我的所有索引都是为我照顾的。我不需要通过删除旧索引并添加新索引来手动更新索引。
并且它也可以根据索引使用上升或下降的变化。
其他答案和评论涉及表重命名,文件重命名和通过代码进行grepping。
我想补充几点:
让我们使用我今天面对的一个现实世界的例子:将模型从"商家"重命名为"商业"。
-
不要忘记更改依赖表和模型的名称
相同的迁移。我同时将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时,请记住搜索单数,复数,大写,
小写,甚至大写(可能出现在注释中)版本
你的字符串。 -
最好首先搜索复数版本,然后搜索单数。那
如果你有一个不规则的复数 - 例如在我的商人::
商业示例 - 您可以正确地获得所有不规则复数。
否则你可能会以"商业"(3 s)为例
中间状态,导致更多的搜索和替换。 -
不要盲目地更换每一个事件。如果您的型号名称发生碰撞
使用通用编程术语,使用其他模型中的值或使用
您的观看中的文字内容可能最终过于过分。
在我的例子中,我想将我的模型名称改为'Business'但是
仍然在我的用户界面的内容中将它们称为"商家"。我在CanCan中也为我的用户提供了"商家"角色 - 商家角色和Merchant模型之间的混淆导致我首先重命名模型。
您还需要替换索引:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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或其他东西定义的其他表中的任何相关列名。你可能也需要编辑它们。
最后,没有回归测试套件这样做会很疯狂。