Sobes.tech
Middle+

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.

  1. Criação da tabela e da coluna type:

    # migration
    create_table :animals do |t|
      t.string :name
      t.string :type
      t.timestamps
    end
    
  2. 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
    
  3. 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.

  1. Adicionar colunas _id e _type no modelo associado: Por exemplo, se Comment pode pertencer a Article ou Photo:

    # migration
    create_table :comments do |t|
      t.text :body
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
    
  2. Declaração da associação nos modelos: No modelo Comment:

    # app/models/comment.rb
    class Comment < ApplicationRecord
      belongs_to :commentable, polymorphic: true
    end
    

    Nos modelos Article e Photo:

    # 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
    
  3. 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).