Parece que a nova versão do rails tem os métodos "change" versus self.up e self.down.
Então, o que acontece quando é necessário reverter uma migração, como saber quais ações executar. Tenho o seguinte método que preciso implementar com base em um tutorial online:
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
Como posso fazer o mesmo usando o novo método de alteração?
ruby-on-rails
migration
banditKing
fonte
fonte
Respostas:
Para muitas operações, os trilhos podem adivinhar qual é a operação inversa (sem problemas). Por exemplo, no seu caso, qual é a operação reversa de
add_column
to call quando você faz rollback? Claro que simremove_column
. Qual é o inverso decreate_table
? Édrop_table
. Portanto, nesses casos, os rails saber como reverter e definir umdown
método é supérfluo (você pode ver na documentação os métodos atualmente suportados pelo método de alteração ).Mas preste atenção porque para algum tipo de operação você ainda precisa definir o
down
método , por exemplo, se você alterar a precisão de uma coluna decimal, como adivinhar a precisão original no rollback? Não é possível, então você precisa definir odown
método.Como disse, sugiro que você leia o Rails Migrations Guide .
fonte
Melhor usar Up, Down, Change:
On Rails 3 (Reversível): que deve adicionar nova coluna no up e preencher todos os registros da tabela apenas no up, e apenas excluir esta coluna no down
def up add_column :users, :location, :string User.update_all(location: 'Minsk') end def down remove_column :users, :location end
Mas:
Você teve que evitar usar o método de mudança que permite economizar algum tempo. Por exemplo, se você não precisasse atualizar o valor da coluna imediatamente após sua adição, reduziria este código da seguinte forma:
def change add_column :users, :location, :string end
Na parte superior, ele adicionará uma coluna à tabela e a removerá na parte inferior. Muito menos código e é um lucro.
No Rails 4: mais uma maneira útil de escrever o que precisamos em um só lugar:
def change add_column :users, :location, :string reversible do |direction| direction.up { User.update_all(location: 'Minsk') } end end
fonte
ActiveRecord::IrreversibleMigration
.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
fonte