Sobes.tech
Middle+

¿Cómo implementar la herencia de modelos o asociaciones polimórficas en Ruby on Rails?

sobes.tech AI

Respuesta de la IA

En Ruby on Rails, la herencia de modelos se implementa mediante la herencia de tabla única (STI) o mediante asociaciones polimórficas.

Herencia de Tabla Única (STI)

STI es adecuada cuando diferentes tipos de objetos tienen atributos similares, pero comportamientos diferentes. Todos los datos se almacenan en una sola tabla, y el tipo de objeto se determina por la columna type.

  1. Creación de la tabla y la columna type:

    # migración
    create_table :animals do |t|
      t.string :name
      t.string :type
      t.timestamps
    end
    
  2. Creación de clases de modelos que heredan de una base:

    # app/models/animal.rb
    class Animal < ApplicationRecord
      # Lógica común para todos los animales
    end
    
    # app/models/dog.rb
    class Dog < Animal
      # Lógica específica para perros
      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:

    # consola
    dog = Dog.create(name: "Buddy")
    cat = Cat.create(name: "Whiskers")
    
    animal = Animal.find(dog.id) # Devolverá un objeto Dog
    

Asociaciones polimórficas

Las asociaciones polimórficas se usan cuando un modelo puede pertenecer a diferentes otros modelos.

  1. Agregar columnas _id y _type en el modelo asociado: Por ejemplo, si Comment puede pertenecer a Article o Photo:

    # migración
    create_table :comments do |t|
      t.text :body
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
    
  2. Declarar la asociación en los modelos: En el modelo Comment:

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

    En los modelos Article y 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:

    # consola
    article = Article.create(title: "Rails Tips")
    photo = Photo.create(caption: "Hermoso atardecer")
    
    article.comments.create(body: "¡Gran artículo!")
    photo.comments.create(body: "¡Hermosa foto!")
    
    Comment.first.commentable # Devolverá un Article
    Comment.last.commentable  # Devolverá un Photo
    

La elección entre STI y asociaciones polimórficas depende de la estructura de datos y las relaciones entre modelos. STI para relaciones "es-un" (Dog es un Animal), asociaciones polimórficas para relaciones "tiene-un" (Article tiene un Comment, Photo tiene un Comment, donde Comment puede pertenecer a Article O Photo).