我想重命名一个表...(任何表.)
我试过这行代码:
ActiveRecord::ConnectionAdapters::SchemaStatements.rename_table(old_name, new_name)
Run Code Online (Sandbox Code Playgroud)
这是奇怪的事情.我知道我第一次使用它,但现在我得到了这个错误:ActiveRecord :: ConnectionAdapters :: SchemaStatements:模块的未定义方法`rename_table'
有什么我需要设置的吗?
Mik*_*hko 290
请记住,在Rails> = 3.1中,您可以使用该change
方法.
class RenameOldTableToNewTable < ActiveRecord::Migration
def change
rename_table :old_table_name, :new_table_name
end
end
Run Code Online (Sandbox Code Playgroud)
cam*_*cam 240
您通常会在迁移中执行此类操作:
class RenameFoo < ActiveRecord::Migration
def self.up
rename_table :foo, :bar
end
def self.down
rename_table :bar, :foo
end
end
Run Code Online (Sandbox Code Playgroud)
von*_*rad 24
.rename_table
是一个实例方法,而不是类方法,因此调用Class.method
不起作用.相反,你必须创建一个类的实例,并在实例上调用方法,如下所示:Class.new.method
.
[编辑]在这种情况下,ActiveRecord::ConnectionAdapters::SchemaStatements
甚至不是一个类(由凸轮指出),这意味着你甚至不能按照我上面所说的创建它的实例.即使你使用了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
Run Code Online (Sandbox Code Playgroud)
然后,您可以使用rake db:migrate
(调用self.up
方法)运行迁移,并使用rake db:rollback
(调用self.down
)来撤消迁移.
归档时间: |
|
查看次数: |
75647 次 |
最近记录: |