Je veux renommer une table ... (n'importe quelle table.)
J'ai essayé cette ligne de code:
ActiveRecord::ConnectionAdapters::SchemaStatements.rename_table(old_name, new_name)
Voici la chose étrange. Je sais que je l'ai fait fonctionner la première fois, mais maintenant j'obtiens cette erreur: méthode non définie `rename_table 'pour ActiveRecord :: ConnectionAdapters :: SchemaStatements: Module
Y a-t-il quelque chose que je dois régler?
ruby-on-rails
Tommy
la source
la source
rename_table
méthode est définie dans leActiveRecord::ConnectionAdapters::SchemaStatements
. Il est destiné à être mélangé à d'autres modules. Si vous vouliez l'exécuter directement, je pense que vous pourriez le faireinclude ActiveRecord::ConnectionAdapters::SchemaStatements; rename_table :foo, :bar
N'oubliez pas que dans Rails> = 3.1, vous pouvez utiliser la
change
méthode.la source
:old_table_name
vers:new_table_name
.rename_table
est une méthode d'instance, pas une méthode de classe, donc appelerClass.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éraclass 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 viaModel.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:
Ensuite, vous pouvez exécuter votre migration avec
rake db:migrate
(qui appelle laself.up
méthode) et utiliserrake db:rollback
(qui appelleself.down
) pour annuler la migration.la source
rename_table
s'agit d'une méthode d'instance, mais elle n'est pas définie dans une classe, donc votre suggestion d'appelerClass.new.method
ne fonctionnera pas (par exemple:ActiveRecord::ConnectionAdapters::SchemaStatements.new
donne l'erreuroMethodError: undefined method
new 'for ActiveRecord :: ConnectionAdapters :: SchemaStatements: Module`rake db:migrate
ourake db:rollback
ne renommez pas le fichier model.rb. Vous devrez modifier manuellement le fichier model.rb.def change
rename_table :my_table, :my_new_table
end
. . . . . Soit dit en passant: A l' intérieur dechange
vous une utilisation de ces commandes:add_column
,add_index
,add_timestamps
,create_table
,remove_timestamps
,rename_column
,rename_index
,rename_table
la source