在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)