Neste artigo, eu vou falar rapidamente sobre as migrations para modelos já existentes. A ideia de tratar desse assunto surgiu quando tive a necessidade de criar um campo/ atributo booleano para um modelo já existente.
Vou partir do pressuposto de que você já tenha um modelo – no meu caso, é o User, que possui apenas um atributo “name” e “email. O Rails fornece um recurso interessante: as migrations, que vão te ajudar bastante a organizar sua base de dados e todo o fluxo possível.
Para criar uma migration para um model já existente, você fará assim:
rails g migration AddHiddenToUser hidden:boolean
Onde o hidden será o campo novo para o modelo User que já existe. O console trará o seguinte:
invoke active_record
create db/migrate/20111021182503_add_hidden_to_user.rb
Ele chama o Active Record e cria um arquivo baseado na linha que você digitou. Aproveite e abra a sua migration gerada. Ao fazê-lo, você obterá:
class AddHiddenToUser < ActiveRecord::Migration
def self.up
add_column :users, :hidden, :boolean
end
def self.down
remove_column :users, :hidden
end
end
O Rails reconheceu que você quer adicionar um atributo do tipo boolean para uma tabela Users (add_column :users, :hidden, :boolean)
A essa altura, o Rails já fez todo o esqueleto, porém nada ainda funciona. Para isso, você vai ter que rodar um rake db:migrate, onde o Rails executa uma função que adiciona literalmente o atributo “hidden” a sua tabela Users.
Veja o log após a execução do comando:
<pre>== AddHiddenToUser: migrating ================================================
-- add_column(:users, :hidden, :boolean)
-> 0.0081s
== AddHiddenToUser: migrated (0.0082s) =======================================</pre>
Para finalizar, basta adicionar o field na view:
<%= f.label :name %><%= mark_required(@user, :name) %><br />
<%= f.text_field :name %>
</div>
<div class="field">
<%= f.label :email %><%= mark_required(@user, :email) %><br />
<%= f.text_field :email %>
</div>
<div class="field"></strong>
<%= f.label :hidden %><br />
<%= f.check_box :hidden %>
</div>
<div class="actions">
<%= f.submit %>
</div>
<% end %>
Antes de concluir, um detalhe importante que percebi, ao implementar essa funcionalidade, é que o Rails fornece funcionalidades interessantes ao acrescentar uma migration dessa forma. Abra o seu console e teste da maneira a seguir:
ruby-1.9.2-p136 :004 > user = User.first
=> #<User id: 1, name: "Uriel", email: "uriel.juliattivalle@gmail.com", created_at: "2011-10-21 18:39:36", updated_at: "2011-10-21 18:39:36", hidden: true>
ruby-1.9.2-p136 :005 > user.hidden?
=> true
Uma vez que seu atributo é do tipo Boolean, o Rails fornece um helper method chamado “hidden?” que retorna true ou false. Muito útil, uma vez que em outras situações teríamos que fazê-lo à mão. Apesar de ser simples, tomaria um certo tempo.