Ответ 1
Обычно вы делаете такие вещи в процессе миграции:
class RenameFoo < ActiveRecord::Migration
def self.up
rename_table :foo, :bar
end
def self.down
rename_table :bar, :foo
end
end
Я хочу переименовать таблицу... (любая таблица.)
Я пробовал эту строку кода:
ActiveRecord::ConnectionAdapters::SchemaStatements.rename_table(old_name, new_name)
Вот странная вещь. Я знаю, что у меня это работает в первый раз, но теперь я получаю эту ошибку: undefined метод `rename_table 'для ActiveRecord:: ConnectionAdapters:: SchemaStatements: Module
Было ли что-то, что мне нужно было установить? Или я буду слепым здесь.
Спасибо!
Обычно вы делаете такие вещи в процессе миграции:
class RenameFoo < ActiveRecord::Migration
def self.up
rename_table :foo, :bar
end
def self.down
rename_table :bar, :foo
end
end
Помните, что в Rails >= 3.1 вы можете использовать метод change
.
class RenameOldTableToNewTable < ActiveRecord::Migration
def change
rename_table :old_table_name, :new_table_name
end
end
.rename_table
- это метод экземпляра, а не метод класса, поэтому вызов Class.method
не будет работать. Вместо этого вам нужно будет создать экземпляр класса и вызвать метод в экземпляре, например: Class.new.method
.
[EDIT]
В этом случае 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
, используя любую модель в своем приложении.
[/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
), чтобы отменить перенос.
ActiveRecord::Migration.rename_table(:old_table_name, :new_table_name)