Back-End

9 dez, 2011

Migrations para models já existentes

Publicidade

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.