.rename_table
est une méthode d'instance, pas une méthode de classe, donc appeler Class.method
ne fonctionnera pas. Vous devez créer à la place une instance de la classe, et appeler la méthode sur l'instance, comme ceci: Class.new.method
.
[EDIT] Dans ce cas, ce ActiveRecord::ConnectionAdapters::SchemaStatements
n'est même pas une classe (comme indiqué par cam), ce qui signifie que vous ne pouvez même pas en créer une instance selon ce que j'ai dit ci-dessus. Et même si vous utilisiez l'exemple de la caméra class Foo; include ActiveRecord::ConnectionAdapters::SchemaStatements; def bar; rename_table; end; end;
, cela ne fonctionnerait toujours pas commerename_table
soulève une exception.
D'autre part, ActiveRecord::ConnectionAdapters::MysqlAdapter
c'est une classe, et c'est probablement cette classe que vous devrez utiliser pour renommer votre table (ou SQLite ou PostgreSQL, selon la base de données que vous utilisez). Maintenant, comme cela se produit, ActiveRecord::ConnectionAdapters::MysqlAdapter
est déjà accessible via Model.connection
, vous devriez donc être complètement capable de faireModel.connection.rename_table
, en utilisant n'importe quel modèle de votre application. [/ÉDITER]
Cependant, si vous souhaitez renommer définitivement une table, je vous suggère d'utiliser une migration pour le faire. C'est facile et le moyen préféré de manipuler la structure de votre base de données avec Rails. Voici comment procéder:
# 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
Ensuite, vous pouvez exécuter votre migration avec rake db:migrate
(qui appelle la self.up
méthode) et utiliser rake db:rollback
(qui appelle self.down
) pour annuler la migration.