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/




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 também JavaScript.
Além disso, aqui sempre levamos à você conteúdos valiosos sobre a carreira de programação, dicas sobre currículos, portfólios, perfil profissional, soft skills, enfim, tudo o que você precisa saber para continuar evoluindo como Programador(a)!

Fique por dentro de todos os conteúdos o/

 

Nossas redes sociais:

📹 • https://youtube.com/Onebitcode [Live todas as terças-feiras às 19h)
💻 • https://linkedin.com/company/onebitcode
🙂 • https://facebook.com/onebitcode
 📱  • https://instagram.com/one_bit_code
🐦 • https://twitter.com/onebitcode

 

Nossos cursos:

🥇 • Programador Full Stack Javascript em 8 Semanas
💎 • Curso Completo de Ruby
 ⚙  • what do you get a guy for his birthday if you just started dating
🐞 • online dating first skype chat

 

Espero que curta nossos conteúdos e sempre que precisar de ajuda, fala com a gente!
E
stamos aqui para você 🙂

Bem-vindo à família OneBitCode o/

5 1 vote
Article Rating
janeiro 17, 2020
Subscribe
Notify of
guest
9 Comentários
Oldest
Newest Most Voted
Inline Feedbacks
View all comments
Felipe
4 anos atrás

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

Leonardo Scorza
Admin
4 anos atrás
Reply to  Felipe

o/

Jonatas Moreira
Jonatas Moreira
4 anos atrás

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
Admin
4 anos atrás

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
4 anos atrás

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
Admin
4 anos atrás

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

Jonatas Moreira
4 anos atrás

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
Andrew Braga
4 anos atrás

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

Tiago Henrique de Moraes
Tiago Henrique de Moraes
3 anos atrás

Alguem sabe como fazer algo semelhante utilizando banco não relacional? MongoDB, MongoID por exemplo? Ou seja polimorfismo não relacional kkk. O banco do projeto a qual estou trabalhando ja é Mongo, porem estou em uma situação onde o polimorfismo cairia como uma luva.

Feito com s2 por OneBitCode

9
0
Would love your thoughts, please comment.x
()
x
%d blogueiros gostam disto: