Переименование стола в рельсах - PullRequest
151 голосов
/ 08 января 2011

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

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

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

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

Что-то мне нужно было установить?

Ответы [ 4 ]

284 голосов
/ 07 декабря 2012

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

 class RenameOldTableToNewTable < ActiveRecord::Migration
   def change
     rename_table :old_table_name, :new_table_name
   end 
 end
237 голосов
/ 08 января 2011

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

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

  def self.down
    rename_table :bar, :foo
  end
end
24 голосов
/ 08 января 2011

.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) для отменымиграция.

2 голосов
/ 26 сентября 2014
ActiveRecord::Migration.rename_table(:old_table_name, :new_table_name)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...