Я хочу переименовать таблицу ... (любую таблицу.)
Я попробовал эту строку кода:
ActiveRecord::ConnectionAdapters::SchemaStatements.rename_table(old_name, new_name)
Вот странная вещь. Я знаю, что это сработало в первый раз, но теперь я получаю эту ошибку: неопределенный метод `rename_table 'для ActiveRecord :: ConnectionAdapters :: SchemaStatements: Module
Было ли что-то, что мне нужно установить?
ruby-on-rails
Томми
источник
источник
rename_table
метод определен вActiveRecord::ConnectionAdapters::SchemaStatements
. Он предназначен для смешивания с другими модулями. Если вы хотите запустить его напрямую, я думаю, что вы могли бы сделатьinclude ActiveRecord::ConnectionAdapters::SchemaStatements; rename_table :foo, :bar
Помните, что в Rails> = 3.1 вы можете использовать
change
метод.источник
: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;
, это все равно не сработало бы, посколькуrename_table
выдвигает исключение.С другой стороны,
ActiveRecord::ConnectionAdapters::MysqlAdapter
это класс, и это, скорее всего , этот класс вы должны использовать , чтобы переименовать таблицу (или SQLite или PostgreSQL, в зависимости от того, что базы данных вы используете). Теперь, как это происходит,ActiveRecord::ConnectionAdapters::MysqlAdapter
уже доступен черезModel.connection
, так что вы должны быть полностью в состоянии сделатьModel.connection.rename_table
, используя любую модель в вашем приложении. [/РЕДАКТИРОВАТЬ]Однако, если вы хотите переименовать таблицу навсегда, я бы предложил использовать для этого миграцию. Это простой и предпочтительный способ управления структурой вашей базы данных с помощью Rails. Вот как это сделать:
Затем вы можете запустить миграцию с помощью
rake db:migrate
(которая вызываетself.up
метод) и использоватьrake db:rollback
(которая вызываетself.down
) для отмены миграции.источник
rename_table
это метод экземпляра, но он не определен в классе, поэтому ваше предложение вызватьClass.new.method
не будет работать (например:ActiveRecord::ConnectionAdapters::SchemaStatements.new
выдает ошибкуoMethodError: undefined method
new 'для ActiveRecord :: ConnectionAdapters :: SchemaStatements: Module`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
источник