在rails中重命名表

Tom*_*mmy 152 ruby-on-rails

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

我试过这行代码:

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)

  • 这也将从`:old_table_name`迁移到`:new_table_name` (36认同)
  • 只是一点评论:或许更改为:old_named_things,:new_named_things以提醒人们,activerecord中的表名通常是复数. (7认同)

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)来撤消迁移.