我想重命名一个表...(任何表格。)
我尝试了这行代码:
ActiveRecord::ConnectionAdapters::SchemaStatements.rename_table(old_name, new_name)
这是奇怪的事情。我知道我第一次使用它,但是现在我收到了这个错误:ActiveRecord的未定义方法`rename_table':: ConnectionAdapters :: SchemaStatements:Module
我需要设置一些东西吗?
答案 0 :(得分:283)
请记住,在Rails> = 3.1中,您可以使用change
方法。
class RenameOldTableToNewTable < ActiveRecord::Migration
def change
rename_table :old_table_name, :new_table_name
end
end
答案 1 :(得分:235)
您通常会在迁移中执行此类操作:
class RenameFoo < ActiveRecord::Migration
def self.up
rename_table :foo, :bar
end
def self.down
rename_table :bar, :foo
end
end
答案 2 :(得分:24)
.rename_table
是一个实例方法,而不是类方法,因此调用Class.method
不起作用。相反,您必须创建类的实例,并在实例上调用该方法,如下所示:Class.new.method
。
[编辑]
在这种情况下,ActiveRecord::ConnectionAdapters::SchemaStatements
甚至不是一个类(由cam指出),这意味着你甚至不能按照我上面所说的创建它的实例。即使你使用了class Foo; include ActiveRecord::ConnectionAdapters::SchemaStatements; def bar; rename_table; end; end;
的cam示例,它仍然无效,因为rename_table
会引发异常。
另一方面,ActiveRecord::ConnectionAdapters::MysqlAdapter
是一个类,你可能必须使用这个类来重命名你的表(或SQLite或PostgreSQL,具体取决于数据库)你正在使用)。现在,正好ActiveRecord::ConnectionAdapters::MysqlAdapter
已经可以通过Model.connection
访问,因此您应该完全能够使用应用程序中的任何模型Model.connection.rename_table
。
[/编辑]
但是,如果您希望永久重命名表,我建议您使用迁移来执行此操作。使用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
)撤消迁移。< / p>
答案 3 :(得分:2)
ActiveRecord::Migration.rename_table(:old_table_name, :new_table_name)