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
对于通过外键依赖于您的模型的任何其他模型,其他表的外键列名将从您的原始模型名派生,因此您还需要对这些依赖模型执行一些rename_column调用。我不得不在各个连接表中将“merchant_id”列重命名为“business_id(对于has_and_belongs_to_many关系)和其他依赖表(对于正常的has_one和has_many关系)。否则,我将以类似“business_stat.merchant_id”的指向“business.id”的列结束。Here's a good answer about doing column renames.
class RenameOldTableToNewTable < ActiveRecord::Migration
def change
reversible do |dir|
dir.up do
rename_table :old_table_name, :new_table_name
end
dir.down do
rename_table :new_table_name, :old_table_name
end
end
end
end
6条答案
按热度按时间jucafojl1#
下面是一个例子:
我不得不手动重命名模型声明文件。
编辑:
在Rails 3.1和4中,
ActiveRecord::Migration::CommandRecorder
知道如何反向迁移rename_table,所以你可以这样做:(You仍然必须通过和手动重命名您的文件。)
ybzsozfc2#
在Rails4中,我所要做的就是修改def
而且我所有的索引都为我处理好了。我不需要通过删除旧的索引和添加新的索引来手动更新索引。
它也可以使用这些变化来提高或降低指数。
r1wp621o3#
其他的回答和评论涉及表重命名、文件重命名和代码中的greping。
我想再补充几点:
让我们举一个我今天面对的现实世界的例子:将模型从“Merchant”重命名为“Business”。
pgx2nnw84#
您还需要替换索引:
和重命名您的文件等,手动为其他答案在这里描述。
参见:http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
请确保在编写此迁移后可以回滚和前滚。如果出现错误,并且迁移尝试影响不再存在的内容时遇到困难,则可能会很棘手。如果无法回滚,最好丢弃整个数据库并重新开始。因此请注意,您可能需要备份某些内容。
另外:在schema_db中查找由has_ or belongs_to或其他函数定义的其他表中的相关列名,可能也需要编辑这些列名。
最后,在没有回归测试套件的情况下完成这项工作将是愚蠢的。
xpcnnkqh5#
您可以执行以下命令:rails g迁移将{旧表名}* 重命名为 *{新表名}
编辑文件并在方法更改中添加此代码之后
重命名表格:{旧表格名称},:{新表格名称}
7eumitmz6#
更现代、更有效的方法是:
++不要忘记手动重命名模型声明文件。
个人经历:
我尝试了@readonly的解决方案来重命名我的表。我只需要在表的末尾添加一个“S”,所以我的旧表和新表之间的唯一区别就是这个字母。这个解决方案不起作用。Rails认为这是同一个表,因此没有做任何更改。我尝试了我上面给出的现代解决方案,它工作正常。