89 votes

Migrations Rails: self.up et self.down versus change

On dirait que la nouvelle version de rails a «changer» par rapport aux méthodes self.up et self.down.

Alors que se passe-t-il quand il faut annuler une migration, comment sait-il quelles actions effectuer? J'ai la méthode suivante que je dois implémenter à partir d'un tutoriel en ligne:

 class AddImageToUsers < ActiveRecord::Migration
  def self.up
    add_column :users, :image_file_name, :string
    add_column :users, :image_content_type, :string
    add_column :users, :image_file_size, :integer
    add_column :users, :image_updated_at, :datetime
  end

  def self.down
    remove_column :users, :image_file_name, :string
    remove_column :users, :image_content_type, :string
    remove_column :users, :image_file_size, :integer
    remove_column :users, :image_updated_at, :datetime
  end    
end
 

Comment puis-je faire la même chose en utilisant la nouvelle méthode de changement?

113voto

Pour de nombreuses opérations de rails peut deviner ce qui est l'opération inverse (sans problèmes). Par exemple, dans votre cas, ce qui est l'inverse de celle de add_column à appeler lorsque vous rollback? Bien sûr, c'est remove_column. Quel est l'inverse de l' create_table? Il est drop_table. Donc dans ces cas, les rails de savoir comment la restauration et de définir un down méthode est superflu (vous pouvez le voir dans la documentation, les méthodes actuellement pris en charge à partir du changement de méthode).

Mais attention, parce que pour certains type de fonctionnement, vous devez toujours définir l' down méthode, par exemple, si vous modifiez la précision d'une colonne decimal comment deviner l'origine de précision sur la restauration? Il n'est pas possible, de sorte que vous devez définir l' down méthode.

Comme dit, je vous suggère de lire les Rails Migrations Guide.

1voto

class AddImageToUsers < ActiveRecord::Migration
  def change
    add_column :users, :image_file_name, :string
    add_column :users, :image_content_type, :string
    add_column :users, :image_file_size, :integer
    add_column :users, :image_updated_at, :datetime
  end
end

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