Skip to content

Instantly share code, notes, and snippets.

@julioprotzek
Last active January 1, 2016 18:09
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save julioprotzek/8181819 to your computer and use it in GitHub Desktop.
Save julioprotzek/8181819 to your computer and use it in GitHub Desktop.
Explicação no comentário.
class DropArticles < ActiveRecord::Migration
def up
drop_table :articles
end
def down
create_table :articles do |t|
t.string :title
t.text :body
t.datetime :published_at
t.timestamps
end
end
end
@julioprotzek
Copy link
Author

Um dos fundamentos das migrations é poder voltar no histórico e desfazer o que foi feito pela migration originalmente. O comando rake db:migrate roda as migrations para frente, mas é possível executar outros comandos para executar as migrations para trás e desfazer a migration. Por isso, toda migration precisa ser capaz de rodar ao contário.

Vários métodos de migrations são capazes de rodar ao contário como o create_table por exemplo.

Em casos como o create_table é possível escrever uma migration em apenas um passo, já que o método é capaz de fazer o inverso quando necessário.

Nesses casos o seu arquivo de migration só precisa de um método change que é executado para frente e para trás e sabe o que fazer automaticamente.

Em outros casos, como o drop_table não há informação o bastante para fazer o inverso, já que para recriar uma tabela que está sendo excluída seriam necessários também os nomes das colunas da tabela.

Nesses casos, nós substituímos change por up e down.
O up é executando quando rodamos a migration para frente com rake db:migrate.
E o down é executado quando rodamos a migration para trás para desfazer o que foi feito no up.

Para saber quais métodos são capazes de voltar no histórico dê uma olhada nessa documentação.

Se estiver usando algum desses métodos use apenas o change na sua migration. Se estiver usando outros métodos, vai precisar substituir o change por up e down.

Digamos que você quer excluir a tabela articles.

Crie uma migration vazia
No terminal digite:

rails g migration drop_articles

Abra o arquivo da migration
Você vai ver o seguinte:

class DropArticles < ActiveRecord::Migration
  def change
  end
end

A migration tem o método change esperando apenas um passo. Como usar o método drop_table que não pode ser desfeito automaticamente, vamos precisar de dois passos dessa vez. Ao invés do método change vamos ter um método up para excluir a tabela e um método down para recriar.

Vamos primeiro criar o método down que será responsável por desfazer essa migration, portanto recriar a tabela articles se necessário.
Para isso, abra a migration que originalmente criou a tabela articles. As migrations podem ser encontradas em db/migrations.

Copie o método change da migration original para essa nova e troque o nome para down.
O resultado vai ser o seguinte:

class DropArticles < ActiveRecord::Migration
  def change
  end

  def down
    create_table :articles do |t|
      t.string :title
      t.text :body
      t.datetime :published_at

      t.timestamps
    end
  end
end

Agora vamos criar o método up, responsável por excluir a tabela.
Renomeie o método change para up.
E adicione o código para excluir a tabela drop_table :articles

O resultado vai ser o seguinte:

class DropArticles < ActiveRecord::Migration
  def up
    drop_table :articles
  end

  def down
    create_table :articles do |t|
      t.string :title
      t.text :body
      t.datetime :published_at

      t.timestamps
    end
  end
end

Salve o arquivo e rode essa migration.
No terminal digite:

rake db:migrate

Para saber mais sobre migrations dê uma olhada no Guia Active Record Migrations

Bons estudos! :D

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment