.rename_table
- это метод экземпляра, а не метод класса, поэтому вызов Class.method
не сработает.Вместо этого вам придется создать экземпляр класса и вызвать метод для этого экземпляра, например: Class.new.method
.
[EDIT] В этом случае ActiveRecord::ConnectionAdapters::SchemaStatements
даже не класс(как указано в cam), что означает, что вы даже не можете создать его экземпляр в соответствии с тем, что я сказал выше.И даже если бы вы использовали пример 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
, используя любую модель в вашем приложении.[/ EDIT]
Однако, если вы хотите навсегда переименовать таблицу, я бы предложил использовать для этого миграцию.Это простой и предпочтительный способ манипулирования структурой вашей базы данных с помощью 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
) для отменымиграция.