Polimorfismo no Ruby On Rails: Aprenda em 10 minutos

Você sabe o que são associações polimórficas e como elas podem facilitar a sua vida de desenvolvedor Ruby On Rails?

Neste artigo rápido e prático nós vamos explicar através de um exemplo passo a passo como implementar essas associações nos seus APPs.

 

O que é Polimorfismo?

A palavra polimorfismo vem do grego e significa aquilo que pode tomar várias formas. Esta característica é um dos conceitos essenciais da programação orientada a objeto (POO). Enquanto a herança se refere às classes e a sua hierarquia, o polimorfismo diz respeito aos métodos dos objetos.

Uma característica das linguagens de programação orientadas a objeto é o polimorfismo. O polimorfismo permite “programar no geral” em vez de “programar no específico”. Em particular, o polimorfismo permite escrever programas que processam objetos que compartilham a mesma superclasse em um hierarquia de classes como se todas fossem objetos da superclasse.

Ao escrever aplicativos rails, você encontrará situações em que você tem associações de modelo que parecem semelhantes, por exemplo, suponha que você tenha os modelos Curso e Laboratório. Agora, cada Curso e Laboratório precisa, ao menos, de um Professor, portanto, você precisa associar Cursos e Laboratórios aos seus respectivos Professores. Se você usar has_many / belongs_to, você terá dois modelos similares para Professores do cursos e Professores do Lab. Em vez de ter dois modelos diferentes, você pode ter um modelo único e é possível associar esse modelo aos modelos Curso e Laboratório usando associação polimórfica.

 

O que vamos criar?

Para que o conceito fique claro, vamos criar o App polimórfico, cujo o objetivo é demostrar como funciona as associações polimórficas no Ruby On Rails. O App permitirá que o usuário tenha um ou mais posts e que esses posts possam ser comentados por outros usuários e os comentários podem ser comentados também. Conjuntamente utilizaremos a gem do devise para realizar a autenticação do usuário.

As tabelas comments e posts (Imagem 1) tem o mesmo conceito de ser comentada, por isso precisamos associar a tabela comentários a dois tipos de diferentes modelos. Esse é o cenário perfeito para um relacionamento polimórfico. Na modelagem do banco de dados adicionamos na tabela comment os seguintes atributes commentable_type que será responsável por informar qual model o objeto pertence e commentable_id que é a chave estrangeira.

Imagem 1 - Modelagem do banco de dados
Imagem 1 – Modelagem do banco de dados

 

 

Ferramentas

  1. • Ruby 2.5
  2. • Ruby on Rails 5.2
  3. • Devise

 

 

Passo a Passo da criação do APP

1. Primeiro vamos criar um novo projeto com o nome polymorphic:

2. Entre na pasta do projeto que foi criado:

3. Nessa etapa iremos fazer a instalação do Devise, abra seu Gemfile e acrescente a seguinte linha de código:

4. execute:

5. Para configurar o devise no seu app execute o seguinte comando no terminal:

6. Vamos gerar os modelos baseado na modelagem do banco de dados:

7. Para criar o banco de dados e as tabelas rode seguinte comando:

8. Adicione ao modelo post em app/models/post.rb:

9. Em app/models/comment.rb acrescente:

10. Atualize o modelo user em app/models/user.rb:

11. Substitua o conteúdo em db/seeds.rb por esse:

Observe como criamos as relações polimórficas:

No diretório db/schema.rb podemos observar como foi criado nossa tabela comments:

No arquivo seeds.rb podemos ver a criação do @post_study pelo usuário pedro.

Ainda observando o que foi criado, podemos perceber que o usuário jon fez um comentário no post do pedro:

Nesse caso temos o commentable_id recebendo o valor do @post_movie.id e o commentable_type recebendo o valor do tipo do post_movie

O usuário pedro, faz um comentário ao comentário do jon, em seu post.

Aqui temos nosso modelo de comentário recebendo um objeto do tipo Comment em sua associação polimórfica. commentable_id recebendo o valor do @comment.id e o commentable_type recebendo o valor de “Comment”

É assim que o ruby funciona com relações polimórficas.

 

12. Rode no terminal o seguinte comando para executar o arquivo seeds.rb e popular o banco de dados:

13. Crie um controller com o nome posts e um método chamado index usando o seguinte comando:

14. Para exigir que o usuário se autentique antes de acessar alguma rota da aplicação, substitua o código de app/controllers/applications_controller.rb por:

 15. Troque o código do arquivo app/controllers/posts_controller.rb por esse:

Aqui estamos criando um controller simples com apenas um método que vai unir todos os objetos e suas relações em um hash.

 16. Substitua o código do arquivo app/views/posts/index.html.erb por esse:

Esse código permite a visualização dos posts do usuário logado e seus comentários associados.

17. Para definir o root do projeto substitua o código do arquivo config/routes.rb por esse:

18. Execute o seguinte commando e abre o browser em localhost:3000:

19 – Faça o login com o usuário cadastrado: email: pedro@email.com e password: 12345678

20. Pronto, agora você pode observar que temos um post com um comentário e outros comentários associados a ele através da relação polimórfica o/

 

 

Conclusão

Conseguimos observar neste exemplo que realizando um bom uso das associações polimórficas é possível melhorar muito a qualidade do APP evitando tabelas desnecessárias no banco de dados.

Além disso, podemos observar neste exemplo também que o Ruby On Rails nos ajuda muito na hora de usar esse tipo de associação permitindo a geração dos models e migrations já com as relações presentes.

 

Se você curtiu aprender mais sobre polimorfismo compartilha esse artigo com seus amigos e deixa um comentário ai na página.

Obrigado o/

 



12 formas de vencer o bloqueio criativo e escrever textos memoráveis (e 6 dicas extras)

Não perca nenhum conteúdo

Receba nosso resumo semanal com os novos posts, cursos, talks e vagas \o/




Você é novo por aqui?

Primeira vez no OneBitCode? Curtiu esse conteúdo? O OneBitCode tem muito mais para você!

O OneBitCode traz conteúdos de qualidade e em português sobre programação com foco em Ruby on Rails e outras tecnologias como Angular, Ionic, React, desenvolvimento de Chatbots e etc.

Se você deseja aprender mais, de uma forma natural e dentro de uma comunidade ativa, visite nosso Facebook e nosso Twitter, veja os screencasts e talks no Youtube, alguns acontecimentos no Instagram, ouça os Podcasts e faça parte de nossa Newsletter.

Além disso, também estamos com alguns e-Books muito interessantes para quem deseja se aprimorar como programador e também como freelancer (os e-Books são gratuitos!):

Espero que curta nossos conteúdos e sempre que precisar de ajuda com os tutoriais, fala com a gente! Seja por Facebook ou e-mail, estamos aqui para você 🙂

Bem-vindo à família OneBitCode \o/

fevereiro 1, 2019

8
Deixe um comentário

avatar
3 Comment threads
5 Thread replies
1 Followers
 
Most reacted comment
Hottest comment thread
4 Comment authors
Andrew BragaJonatas MoreiraLeonardo ScorzaJonatas MoreiraFelipe Recent comment authors
  Subscribe  
newest oldest most voted
Notify of
Felipe
Membro
Felipe

Muito bom, estava com dúvidas no assunto, obrigado por esclarecer!

Leonardo Scorza

o/

Jonatas Moreira
Visitante
Jonatas Moreira

Olá, tudo bem? Show a publicação, quero dar continuidade, mas travei em uma parte, procurei na internet mudando as partes do erro, mas não achei a solução, você sabe como resolver? Primeiro, quando fui instalar o devise, ele dava um erro, informando que no adapter, o sqlite3 não carregava, eu mudei para o postgres, e deu certo. Gerei os modelos, tudo ok. Quando chegou na parte de criar o banco, ele fica dando esse erro. rake db:create db:migrate Database 'db/development/postgresql' already exists PG::SyntaxError: ERROR: syntax error at or near "." LINE 1: CREATE DATABASE "db/test"."postgresql" ENCODING = 'utf8' ^ :… Read more »

Leonardo Scorza

E ai Jonatas, beleza?
Parece que esse database já existe no seu postgreSQL.
Tenta rodar (isso vai apagar e recriar): rails db:drop db:create db:migrate

Abraço

Jonatas Moreira
Membro
Jonatas Moreira

Opa, tudo bem, graças a Deus! E ai, tudo ok? Leonardo, muito grato pela rápida resposta! Eu tentei o comando que você passou, ele mudou o nome do erro, mas ele aponta o mesmo erro! Quando copia o erro no terminal, não mostra aqui, mas ele fica apontando para o ponto . LINE 1: DROP DATABASE IF EXISTS “db/test“.”postgresql” Dropped database 'db/development/postgresql' PG::SyntaxError: ERROR: syntax error at or near "." LINE 1: DROP DATABASE IF EXISTS "db/test"<strong>.</strong>"postgresql" ^ : DROP DATABASE IF EXISTS "db/test"."postgresql" Couldn't drop database 'db/test.postgresql' rails aborted! ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near "." LINE… Read more »

Leonardo Scorza

Que estranho, como está o seu database.yml?

Jonatas Moreira
Membro
Jonatas Moreira

Então! o database.yml está assim # SQLite version 3.x # gem install sqlite3 # # Ensure the SQLite 3 gem is defined in your Gemfile # gem ‘sqlite3’ # default: &default adapter: postgresql pool: timeout: 5000 host: localhost development: <<: *default database: db/development.postgresql # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default database: db/test.postgresql production: <<: *default database: db/production.postgresql E o GemFile assim source 'https://rubygems.org' git_source(:github) do |repo_name| repo_name = "#{repo_name}/#{repo_name}" unless… Read more »

Andrew Braga
Visitante
Andrew Braga

Muito boa a explicação. vou tentar executar esse tutorial.

Feito com s2 por OneBitCode
%d blogueiros gostam disto: