你如何编写一个迁移来重命名Rails中的ActiveRecord模型及其表格?
我在命名上很糟糕,并意识到在我的Rails应用程序中,我的模型有更好的名称。
有没有办法使用迁移来重命名模型及其相应的表?
这是一个例子:
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
(您仍然必须通过手动重命名您的文件。)
在Rails 4中,我所要做的只是def变化
def change rename_table :old_table_name, :new_table_name end
我所有的指标都照顾好了。 我不需要手动更新索引,通过删除旧的和添加新的索引。
而且它也适用于索引的上下变化。
其他答案和评论涵盖了表格重命名,文件重命名,并通过您的代码grepping。
我想补充一些注意事项:
让我们用一个我今天面对的现实世界的例子:将模型从“商人”重命名为“商业”。
- 不要忘记在同一迁移中更改从属表和模型的名称。 我将Merchant和MerchantStat模型同时更改为Business和BusinessStat。 否则,当执行search和replace时,我不得不做太多的select和select。
- 对于通过外键依赖于模型的其他模型,其他表的外键列名将从您的原始模型名派生。 所以你也想在这些依赖模型上做一些rename_column调用。 例如,我必须在各种连接表(对于has_and_belongs_to_many关系)和其他从属表(对于正常的has_one和has_many关系)中将'merchant_id'列重命名为'business_id'。 否则,我会结束像'business_stat.merchant_id'指向'business.id'列。 这是关于做列重命名的一个很好的答案。
- 在进行grepping时,请记住要searchstring的单数,复数,大写,小写,甚至大写(可能发生在注释中)的版本。
- 最好先search复数版本,然后单数。 这样,如果你有一个不规则的复数 – 例如在我的商家::企业例子 – 你可以得到所有的不规则复数正确。 否则,你可能会以“商业”(3秒)作为中间状态,导致更多的search和replace。
- 不要盲目地replace每一个事件。 如果您的模型名称与常见编程术语,其他模型中的值或视图中的文本内容相冲突,则最终可能会过于迫切。 在我的示例中,我想将我的模型名称更改为“Business”,但在我的用户界面的内容中仍将其称为“商家”。 在CanCan中,我也有一个“商人”angular色,那就是商人angular色和Merchant模型之间的混淆,使得我首先重新命名模型。
您还需要replace您的索引:
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或其他定义的其他表中的任何相关的列名称。 你可能也需要编辑这些。
最后,如果没有回归testing套件,这将是疯狂的。