提问



我在命名时很糟糕,并且意识到我的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


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

其它参考1


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


def change
  rename_table :old_table_name, :new_table_name
end


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


它也适用于索引上升或下降的变化。

其它参考2


其他答案和评论包括表格重命名,文件重命名和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的列。这是关于进行列重命名的一个很好的答案。

  • 在点击时,请记住搜索单数,复数,大写,
    小写,甚至大写(可能出现在注释中)版本
    你的字符串。

  • 最好首先搜索复数版本,然后再搜索单数
    如果你有一个不规则的复数的方式 - 例如在我的商人::
    商业示例 - 您可以正确地获取所有不规则复数。
    否则你最终可能会以业务(3 s)为例
    中间状态,导致更多的搜索和替换。

  • 不要盲目地更换每一个事件。如果您的模型名称发生碰撞
    使用通用编程术语,使用其他模型中的值或使用
    您的观看中的文字内容,最终可能会过于急切。
    在我的示例中,我想将我的模型名称更改为Business但是
    仍然在我的UI中的内容中将它们称为商家。我在CanCan中的用户也有商家角色 - 商家角色和商家模型之间的混淆导致我首先重命名模型。


其它参考3


您还需要替换索引:


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 [7]


编写此迁移后,请确保您可以回滚并前滚。如果出现问题并且试图影响不再存在的迁移,那么它会变得棘手。如果你不能回滚,最好将整个数据库丢弃并再次启动。所以要注意你可能需要备份一些东西。


另外:检查schema_db以查找has_或belongs_to或其他东西定义的其他表中的任何相关列名。你可能也需要编辑它们。


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