当前位置:  开发笔记 > 后端 > 正文

如何编写迁移以在Rails中重命名ActiveRecord模型及其表?

如何解决《如何编写迁移以在Rails中重命名ActiveRecord模型及其表?》经验,为你挑选了4个好方法。

我在命名时很糟糕,并且意识到我的Rails应用程序中的模型有更好的名称.
有没有办法使用迁移来重命名模型及其相应的表?



1> Readonly..:

这是一个例子:

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

(您仍然需要通过手动重命名文件.)


另外,就像抬头一样,您希望在rename_table调用中使用表名的复数形式.
git grep是你的朋友.我现在正在将一个Activity改名为习惯:`git grep -i activit`非常具有启发性.
@mathee:是的,您必须手动更改,或者使用可以执行Ruby重构并将其提交到版本控制系统的IDE.
不要忘记你的routes.rb!

2> bfcoder..:

在Rails 4中,我所要做的只是改变

def change
  rename_table :old_table_name, :new_table_name
end

我的所有索引都是为我照顾的.我不需要通过删除旧索引并添加新索引来手动更新索引.

并且它也可以根据索引使用上升或下降的变化.



3> armchairdj..:

其他答案和评论涉及表重命名,文件重命名和通过代码进行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)作为中间状态,从而导致更多的搜索和替换.

不要盲目地更换每一个事件.如果您的模型名称与常见的编程术语,其他模型中的值或视图中的文本内容相冲突,您最终可能会过于急切.在我的示例中,我想将我的模型名称更改为"商家",但仍然在我的UI中的内容中将它们称为"商家".我在CanCan中的用户也有"商家"角色 - 商家角色和商家模型之间的混淆导致我首先重命名模型.



4> Rimian..:

您还需要替换索引:

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

最后,没有回归测试套件这样做会很疯狂.


对于rails 4.0.0.beta1迁移,不需要手动更新索引.AR自行更新.
推荐阅读
落单鸟人
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有