Answers:
您通常会在迁移中执行以下操作:
class RenameFoo < ActiveRecord::Migration
def self.up
rename_table :foo, :bar
end
def self.down
rename_table :bar, :foo
end
end
rename_table
方法在中定义ActiveRecord::ConnectionAdapters::SchemaStatements
。它打算混入其他模块中。如果您想直接运行它,我想您可以这样做include ActiveRecord::ConnectionAdapters::SchemaStatements; rename_table :foo, :bar
请记住,在Rails> = 3.1中可以使用该change
方法。
class RenameOldTableToNewTable < ActiveRecord::Migration
def change
rename_table :old_table_name, :new_table_name
end
end
:old_table_name
到:new_table_name
.rename_table
是实例方法,而不是类方法,因此调用Class.method
将无法进行。相反,您必须创建该类的实例,然后在该实例上调用方法,如下所示:Class.new.method
。
[编辑]在这种情况下,ActiveRecord::ConnectionAdapters::SchemaStatements
它甚至都不是类(正如cam指出的那样),这意味着您甚至无法按照我上面所说的创建它的实例。即使您使用cam的示例class Foo; include ActiveRecord::ConnectionAdapters::SchemaStatements; def bar; rename_table; end; end;
,它仍然无法正常工作,因为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
)撤消迁移。
rename_table
是一个实例方法,但它不是在一个类中定义的,所以你的建议,呼吁Class.new.method
将无法正常工作(例如:ActiveRecord::ConnectionAdapters::SchemaStatements.new
给出了错误oMethodError: undefined method
ActiveRecord的:: ConnectionAdapters :: SchemaStatements新”:Module`
rake db:migrate
或rake db:rollback
不会重命名model.rb文件。您将需要手动更改model.rb文件。
def change
rename_table :my_table, :my_new_table
end
。。。。。顺便说一句:内幕change
您的使用以下命令:add_column
,add_index
,add_timestamps
,create_table
,remove_timestamps
,rename_column
,rename_index
,rename_table