¿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.
-
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 -
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 -
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.
-
Agregar columnas
_idy_typeen el modelo asociado: Por ejemplo, siCommentpuede pertenecer aArticleoPhoto:# migración create_table :comments do |t| t.text :body t.references :commentable, polymorphic: true, null: false t.timestamps end -
Declarar la asociación en los modelos: En el modelo
Comment:# app/models/comment.rb class Comment < ApplicationRecord belongs_to :commentable, polymorphic: true endEn los modelos
ArticleyPhoto:# 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:
# 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).