回答:
通常、移行ではこのようなことを行います。
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によって指摘された)クラスでもありません。つまり、上記で述べたように、そのインスタンスを作成することもできません。また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)を使用して移行を元に戻すことができます。
rename_tableはインスタンスメソッドであることに同意しますが、それはクラスで定義されていないため、呼び出しの提案Class.new.methodは機能しません(たとえば、ActiveRecord :: ConnectionAdapters :: SchemaStatements:Module`に対してActiveRecord::ConnectionAdapters::SchemaStatements.newエラーoMethodError: undefined method newを返します)
rake db:migrateまたはrake db:rollbackmodel.rbファイルの名前を変更しないことにも注意してください。model.rbファイルを手動で変更する必要があります。
def change rename_table :my_table, :my_new_table endchangeadd_columnadd_indexadd_timestampscreate_tableremove_timestampsrename_columnrename_indexrename_table