Como implementar herança de modelos ou associações polimórficas no Ruby on Rails?
sobes.tech IA
Resposta da IA
No Ruby on Rails, a herança de modelos é implementada através de Herança de Tabela Única (STI) ou usando associações polimórficas.
Herança de Tabela Única (STI)
O STI é adequado quando diferentes tipos de objetos têm atributos semelhantes, mas comportamentos diferentes. Todos os dados são armazenados numa única tabela, e o tipo de objeto é determinado pela coluna type.
-
Criação da tabela e da coluna
type:# migration create_table :animals do |t| t.string :name t.string :type t.timestamps end -
Criação de classes de modelos que herdam de uma base:
# app/models/animal.rb class Animal < ApplicationRecord # Lógica comum a todos os animais end # app/models/dog.rb class Dog < Animal # Lógica específica para cães def bark "Woof!" end end # app/models/cat.rb class Cat < Animal # Lógica específica para gatos def meow "Meow!" end end -
Uso:
# console dog = Dog.create(name: "Buddy") cat = Cat.create(name: "Whiskers") animal = Animal.find(dog.id) # Vai retornar um objeto Dog
Associações polimórficas
As associações polimórficas são usadas quando um modelo pode pertencer a diferentes outros modelos.
-
Adicionar colunas
_ide_typeno modelo associado: Por exemplo, seCommentpode pertencer aArticleouPhoto:# migration create_table :comments do |t| t.text :body t.references :commentable, polymorphic: true, null: false t.timestamps end -
Declaração da associação nos modelos: No modelo
Comment:# app/models/comment.rb class Comment < ApplicationRecord belongs_to :commentable, polymorphic: true endNos modelos
ArticleePhoto:# app/models/article.rb class Article < ApplicationRecord has_many :comments, as: :commentable end # app/models/photo.rb class Photo < ApplicationRecord has_many :comments, as: :commentable end -
Uso:
# console article = Article.create(title: "Dicas do Rails") photo = Photo.create(caption: "Pôr do sol bonito") article.comments.create(body: "Ótimo artigo!") photo.comments.create(body: "Foto linda!") Comment.first.commentable # Vai retornar um Article Comment.last.commentable # Vai retornar um Photo
A escolha entre STI e associações polimórficas depende da estrutura de dados e das relações entre modelos. STI para relações "é um" (Dog é um Animal), associações polimórficas para relações "tem um" (Article tem um Comment, Photo tem um Comment, onde Comment pode pertencer a Article OU Photo).