在rails中重命名表

时间:2011-01-08 00:44:35

标签: ruby-on-rails

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

我尝试了这行代码:

ActiveRecord::ConnectionAdapters::SchemaStatements.rename_table(old_name, new_name)

这是奇怪的事情。我知道我第一次使用它,但是现在我收到了这个错误:ActiveRecord的未定义方法`rename_table':: ConnectionAdapters :: SchemaStatements:Module

我需要设置一些东西吗?

4 个答案:

答案 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)