Rea*_*nly 399 migration ruby-on-rails rails-activerecord
我在命名时很糟糕,并且意识到我的Rails应用程序中的模型有更好的名称.
有没有办法使用迁移来重命名模型及其相应的表?
Rea*_*nly 576
这是一个例子:
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
Run Code Online (Sandbox Code Playgroud)
我必须手动重命名模型声明文件.
编辑:
在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
Run Code Online (Sandbox Code Playgroud)
(您仍然需要通过手动重命名文件.)
bfc*_*der 64
在Rails 4中,我所要做的只是改变
def change
rename_table :old_table_name, :new_table_name
end
Run Code Online (Sandbox Code Playgroud)
我的所有索引都是为我照顾的.我不需要通过删除旧索引并添加新索引来手动更新索引.
并且它也可以根据索引使用上升或下降的变化.
arm*_*rdj 45
其他答案和评论涉及表重命名,文件重命名和通过代码进行grepping.
我想补充几点:
让我们使用我今天面对的一个现实世界的例子:将模型从"商家"重命名为"商业".
Rim*_*ian 23
您还需要替换索引:
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
Run Code Online (Sandbox Code Playgroud)
并按照此处描述的其他答案手动重命名您的文件等.
请参阅:http://api.rubyonrails.org/classes/ActiveRecord/Migration.html
编写此迁移后,请确保您可以回滚并前滚.如果出现问题并且试图影响不再存在的事物的迁移,它会变得棘手.最好将整个数据库丢弃,如果无法回滚,请重新开始.所以要注意你可能需要备份一些东西.
另外:检查schema_db以查找has_或belongs_to或其他东西定义的其他表中的任何相关列名.你可能也需要编辑它们.
最后,没有回归测试套件这样做会很疯狂.