157 votes

Changement de nom de table dans les rails

J’ai envie de renommer une table... (n’importe quelle table.)

J’ai essayé cette ligne de code :

Voici la chose étrange. Je sais que je l’ai eu le premier temps de travail, mais maintenant j’obtiens cette erreur : undefined méthode « rename_table » pour ActiveRecord::ConnectionAdapters::SchemaStatements:Module

Était-ce là quelque chose que je dois mettre ? Ou je vais aveugle ici...

Merci !

299voto

Mikhail Grishko Points 1417

Dans Rails > = 3.1, vous pouvez utiliser le `` méthode.

249voto

cam Points 8882

Vous feriez habituellement ce genre de chose dans une migration :

24voto

vonconrad Points 14378

.rename_table est une méthode d'instance, et non pas une méthode de classe, afin de l'appelant Class.method n'est pas d'aller travailler. Au lieu de cela, vous devez créer une instance de la classe, et d'appeler la méthode sur l'exemple, comme ceci: Class.new.method.

[MODIFIER] Dans ce cas, ActiveRecord::ConnectionAdapters::SchemaStatements n'est même pas une classe (comme l'a souligné cam), ce qui signifie que vous ne pouvez même pas créer une instance de ce que par ce que j'ai dit ci-dessus. Et même si vous avez utilisé cam exemple d' class Foo; include ActiveRecord::ConnectionAdapters::SchemaStatements; def bar; rename_table; end; end;, il n'aurait toujours pas de travail en tant que rename_table lève une exception.

D'autre part, ActiveRecord::ConnectionAdapters::MysqlAdapter est une classe, et il est probable que cette classe que vous auriez à utiliser pour renommer votre table (ou SQLite ou PostgreSQL, selon la base de données que vous utilisez). Maintenant, comme il arrive, ActiveRecord::ConnectionAdapters::MysqlAdapter est déjà accessible par Model.connection, de sorte que vous devriez être tout à fait capable de le faire Model.connection.rename_table, à l'aide de n'importe quel modèle dans votre application. [/EDIT]

Cependant, si vous souhaitez en permanence renommer une table, je voudrais suggérer à l'aide d'une migration de le faire. Il est facile et le moyen privilégié de la manipulation de votre structure de base de données avec des Rails. Voici comment faire:

# 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 l' self.up méthode), et d'utiliser rake db:rollback (qui appelle self.down) pour annuler la migration.

3voto

Prateek Mittal Points 29

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

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X