在rails中重命名表

我想重命名一个表…(任何表)

我试过这一行代码:

ActiveRecord::ConnectionAdapters::SchemaStatements.rename_table(old_name, new_name) 

这是奇怪的事情。 我知道我第一次得到它,但现在我得到这个错误:未定义的方法`rename_table'为ActiveRecord :: ConnectionAdapters :: SchemaStatements:模块

有什么我需要设置? 还是我在这里失明

谢谢!

你通常会在迁移中做这样的事情:

 class RenameFoo < ActiveRecord::Migration def self.up rename_table :foo, :bar end def self.down rename_table :bar, :foo end end 

请记住,在Rails> = 3.1中,您可以使用change方法。

  class RenameOldTableToNewTable < ActiveRecord::Migration def change rename_table :old_table_name, :new_table_name end end 

.rename_table是一个实例方法,而不是一个类方法,所以调用Class.method是不会工作的。 相反,你必须创build一个类的实例,并调用实例上的方法,如下所示: Class.new.method

[编辑]在这种情况下, ActiveRecord::ConnectionAdapters::SchemaStatements甚至不是一个类(由凸轮指出),这意味着你甚至不能创build一个实例,如上所述。 即使你使用cam的class Foo; include ActiveRecord::ConnectionAdapters::SchemaStatements; def bar; rename_table; end; end;的例子, class Foo; include ActiveRecord::ConnectionAdapters::SchemaStatements; def bar; rename_table; end; end; ,它仍然不会工作rename_table引发exception。

另一方面, ActiveRecord::ConnectionAdapters::MysqlAdapter 一个类,很可能你需要使用这个类来重命名你的表(或SQLite或PostgreSQL,取决于你使用的数据库)。 现在,碰巧, ActiveRecord::ConnectionAdapters::MysqlAdapter已经可以通过Model.connection访问,所以你应该完全可以使用Model.connection.rename_table ,在你的应用程序中使用任何模型。 [/编辑]

但是,如果您想永久性重命名表,我会build议使用迁移来完成。 这很容易,也是使用Rails处理数据库结构的首选方式。 以下是如何做到这一点:

 # Commandline rails generate migration rename_my_table # In db/migrate/[timestamp]_rename_my_table.rb: class RenameMyTable < ActiveRecord::Migration def self.up rename_table :my_table, :my_new_table end def self.down rename_table :my_new_table, :my_table end end 

然后,可以使用rake db:migrate (它调用self.up方法)来运行迁移,并使用rake db:rollback (它调用self.down )来撤消迁移。

 ActiveRecord::Migration.rename_table(:old_table_name, :new_table_name)