回答:
通常、移行ではこのようなことを行います。
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: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