#desenvolvimento, #projetos

Criando models com Ruby on Rails


Voltando ao Rails gostaria de compartilhar a criação dos models do meu novo projeto pessoal.

O primeiro passo é criar um projeto Rails como o que foi criado aqui.

O contexto utilizado será referente a uma publicação de um anúncio bem simplificado. E para isso será necessária a criação de três models: Usuário, Contato e Anúncio com as associações apresentadas na figura abaixo.

Aluguel Particular - Diagrama de classe

Aluguel Particular – Diagrama de classe

Entre na pasta do seu projeto Rails:

cd projetorails

Crie o model do Usuário:

rails g model usuario

O Rails criou uma migração inicial para o nosso model. Esta migração encontra-se na pasta db/migrate/<horário_da_criação>_create_usuarios.rb. Abra a migração criada para o model e adicione as colunas:

class CreateUsuarios < ActiveRecord::Migration
   def self.up
      create_table :usuarios do |t|
         t.string  :email, :limit => 50
         t.string  :senha, :limit => 20
         t.string  :nome,  :limit => 50
         t.string  :CPF,   :limit => 14
         t.timestamps
      end
   end

   def self.down
      drop_table :usuarios
   end
end

No terminal execute o comando abaixo para rodar a migração que criará a tabela de usuários:

rake db:migrate

Crie o model de Contato:

rails g model contato

Altere a migração db/migrate<horário_da_criação>_create_contatos.rb:

class CreateContatos < ActiveRecord::Migration
   def self.up
      create_table :contatos do |t|
        t.string :telefone, :limit => 20
        t.string :celular,  :limit => 20
        t.string :twitter,  :limit => 50
        t.string :facebook, :limit => 50
        t.string :msn,      :limit => 50
        t.timestamps
      end
   end

   def self.down
      drop_table :contatos
   end
end

No terminal execute o comando abaixo para rodar a migração que criará a tabela de contatos:

rake db:migrate

Crie o model para Anúncio:

rails g model anuncio

Altere a migração db/migrate<horário_da_criação>_create_anuncios.rb:

class CreateAnuncios < ActiveRecord::Migration
   def self.up
      create_table :anuncios do |t|
         t.text :descricao, :limit => 2048
         t.timestamps
      end
   end

   def self.down
      drop_table :anuncios
   end
end

No terminal execute o comando abaixo para rodar a migração que criará a tabela de anúncios:

rake db:migrate

Quase pronto! Os models estão criados e você pode visualizar as tabelas através do plugin SQLite Manager para o Firefox. Mas ainda falta acrescentar as associações entre os models e entre as tabelas.

Vamos então associar o contato ao usuário. Edite o model Usuário que se encontra no diretório app/models/usuario.rb:

class Usuario < ActiveRecord::Base
   has_one :contato
end

Agora edite o model Contato (app/models/contato.rb):

class Contato < ActiveRecord::Base
   belongs_to :usuario
end

Esta associação nos diz que um usuário possui um contato. Sendo assim vamos criar uma migração para adicionar este relacionamento na tabela.

rails g migration add_column_contato_usuario

E edite a migração criada em db/migrate/<horário_da_criação>_add_column_contato_usuario.rb:

class AddColumnContatoUsuario < ActiveRecord::Migration
   def self.up
      add_column :usuarios, :contato_id, :integer
   end

   def self.down
      remove_column :usuarios, :contato_id
   end
end

No terminal execute o comando para gerar a migração de atualização da tabela de usuários:

rake db:migrate

E para finalizar vamos associar o anúncio ao usuário.
Edite o model Usuário(app/models/usuario.rb) para indicar que um usuário possui vários anúncios:

class Usuario < ActiveRecord::Base
   has_one  :contato
   has_many :anuncios
end

Edite também o model Anúncio(app/models/anuncio.rb) para afirmar que ele pertence a um usuário:

class Anuncio < ActiveRecord::Base
   belongs_to :usuario
end

Crie a migração que irá adicionar o id do usuário ao anúncio:

rails g migration add_column_usuario_anuncio

Edite a migração db/migrate/<horário_da_criação>_add_column_usuario_anuncio.rb:

class AddColumnUsuarioAnuncio < ActiveRecord::Migration
   def self.up
      add_column :anuncios, :usuario_id, :integer
   end

   def self.down
      remove_column :anuncios, :usuario_id
   end
end

No terminal execute o comando para gerar a migração de atualização da tabela de anúncios:

rake db:migrate

Agora sim os models estão prontos para criarmos os testes e as validações, mas isto será assunto para o próximo post.

Para entender melhor o funcionamento dos models e suas associações não deixe de ler a apostila RR-71 da Caelum e a documentação da API ActiveRecord.

Até breve 😉

Anúncios
Padrão

11 comentários sobre “Criando models com Ruby on Rails

  1. Jeferson,

    O attr_accessible serve para definir os atributos que serão acessíveis pelo mass assignment. No exemplo do post eu não utilizei o attr_accessible para não aumentar a complexidade, mas acredito que o ideal é utilizá-lo sempre 😉

    Sobre o attr_accessible acho que esse post muito esclarecedor:
    http://simplesideias.com.br/recebendo-dados-do-usuario-attr_accessible-e-attr_protected

    Já o accepts_nested_attributes_for deve ser utilizado para inclusão que envolve vários modelos, ele facilita a inclusão dos atributos nas tabelas associadas e também facilita a exclusão dos objetos. Ou seja o attr_accessible e o accepts_nested_attributes_for possuem funcionalidades distintas.

    Espero que tenha ficado um pouco mais claro.

    Até breve.

  2. Jeferson M. disse:

    Brena, qual é a diferença entre usar “accepts_nested_attributes_for” , “attr_accessible” e, como no seu projeto acima, não usar nada nos models?

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s