Переименование стола в рельсах

Я хочу переименовать таблицу... (любая таблица.)

Я пробовал эту строку кода:

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

Вот странная вещь. Я знаю, что у меня это работает в первый раз, но теперь я получаю эту ошибку: undefined метод `rename_table 'для ActiveRecord:: ConnectionAdapters:: SchemaStatements: Module

Было ли что-то, что мне нужно было установить? Или я буду слепым здесь.

Спасибо!

Ответ 1

Обычно вы делаете такие вещи в процессе миграции:

class RenameFoo < ActiveRecord::Migration
  def self.up
    rename_table :foo, :bar
  end

  def self.down
    rename_table :bar, :foo
  end
end

Ответ 2

Помните, что в Rails >= 3.1 вы можете использовать метод change.

 class RenameOldTableToNewTable < ActiveRecord::Migration
   def change
     rename_table :old_table_name, :new_table_name
   end 
 end

Ответ 3

.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), чтобы отменить перенос.

Ответ 4

ActiveRecord::Migration.rename_table(:old_table_name, :new_table_name)