Jornada On Rails - Modelos e migrações
De volta a cena com mais RoR aprendi como o framework trabalha com banco de dados, temos 2 opções, diretamente com scripts SQL ou através de migrações, qual usar?
Bem, preferi migrações por motivos básicos, com elas não precisamos usar SQL diretamente, não que isso seja um problema, mas garante portabilidade, pois o Rails é inteligente o suficiente para trabalhar com vários banco de dados e pode gerar o SQL "personalizado" para cada um deles com a mesma migração que foi criada.
Como já comentamos o Rails se utiliza da estratégia (pattern) MVC, logo os modelos são o M do MVC e é nessa camada que definimos nosso modelo de dados, validações e relacionamentos, então mão na massa.
Pelo Prompt dentro da nossa aplicação criei um modelo chamado Projects com o comando:
ruby script/generate model Projects
O Rails gerou vários arquivos e dentre eles 2 em especial, app/model/projects.rb e db/migrate/001_create_projects.rb, respectivamente o arquivo de modelo e de migração. Abrindo o arquivo de modelo temos:
-
class Projects <ActiveRecord::Base
-
end
E no arquivo de migração temos:
-
class CreateProjects <ActiveRecord::Migration
-
def self.up
-
create_table :projects do |t|
-
end
-
end
-
-
def self.down
-
drop_table :projects
-
end
-
end
O arquivo de migração já vem com 2 métodos por default, self_up que deve conter o código da tabela a ser criada no banco de dados e é executado quando você manda rodar a migração e self_down que deve conter o código para eliminação da tabela caso você altere a versão do banco para uma versão anterior(mais pra frente você vai entender isso).
Podemos perceber que o Rails já começou a criação da nossa tabela utilizando uma linguagem de domínio especifica, então podemos continuar:
-
class CreateProjects <ActiveRecord::Migration
-
def self.up
-
create_table :projects do |t|
-
t.column :name, :string
-
t.column :init_date, :datetime
-
t.column :description, :text
-
end
-
end
-
-
def self.down
-
drop_table :projects
-
end
-
end
Como pode ser visto acima é usando o método column passando os argumentos nome da coluna e tipo de dado que a coluna deve armazenar, esta estratégia do Rails é fantástica, pois independente do SGDB utilizado a migração é a mesma.
Antes de executarmos nossa migração precisamos alterar nosso arquivo config/database.yml.
Três bancos de dados
O Rails utiliza 3 bancos de dados para cada aplicação sendo: development, test e production, usaremos o banco de teste para executarmos nossa migração, então devemos configurar o arquivo de banco de dados a partir da linha 24:
test:
adapter: mysql
database: ger_test
username: root
password:
host: localhost
OBS: Cuidado ao utilizar o banco de dados de teste, pois a cada novo Unit Test o Rails limpa os dados do Banco.
Para está aplicação estou utilisando MySql, porém o Rails suporta vários outros SGDBa que devem ser informados na opção adapter, definimos o nome do banco de dados, usuário, senha e servidor.
agora no prompt do DOS executamos o comando:
rake db:migrate
O rake é um comando paralelo ao make que é utilizado nesse caso para executar a migração, agora temos nossas tabelas no banco de dados. O Rails criou a tabela projects e mais uma tabela chamada schema_info com uma única coluna chamada version, está tabela tem por função armazenar o número de versão do seu esquema de dados, para executar um retrocesso a versão anterior basta utilizar o comando:
rake db:migrate version 0 (neste caso estamos deletando todas as tabelas do banco)
Concluindo posso dizer que o "ideal" é utilizar as migrações do Rails, mas ele é suficientemente flexível para permitir que você gerencie manualmente através de scripts SQL, a cada dia que passa me sinto mais a vontade e me apaixono mais pelo Rails.
Posts Relacionados


Olá Aguinelo. Gostei da idéia doa tradução, além de ajudar várias pessoas podemos promover e difundir a tecnologia. Como ele é livre pra download e como não vamos vender acho que não tem problema, o que vocÇe acha?
Abraço
Marcos estive vendo com mais calma e a licença de distribuição é Creative Commons, isso significa que podemos fazer o que quisermos com ele, até vender desde que preserve a fonte e começo hj mesmo a tradução. Conto com você e seu blog para ajudar nma divulgação depois de traduzido.
Abraços