Comment implémenter l'héritage de modèles ou les associations polymorphes dans Ruby on Rails?
sobes.tech IA
Réponse de l'IA
En Ruby on Rails, l'héritage des modèles est réalisé via l'héritage de table unique (STI) ou par le biais d'associations polymorphes.
Héritage de Table Unique (STI)
STI convient lorsque différents types d'objets ont des attributs similaires mais des comportements différents. Toutes les données sont stockées dans une seule table, et le type d'objet est déterminé par la colonne type.
-
Création de la table et de la colonne
type:# migration create_table :animals do |t| t.string :name t.string :type t.timestamps end -
Création de classes de modèles héritant d'une classe de base:
# app/models/animal.rb class Animal < ApplicationRecord # Logique commune à tous les animaux end # app/models/dog.rb class Dog < Animal # Logique spécifique aux chiens def bark "Woof!" end end # app/models/cat.rb class Cat < Animal # Logique spécifique aux chats def meow "Meow!" end end -
Utilisation:
# console dog = Dog.create(name: "Buddy") cat = Cat.create(name: "Whiskers") animal = Animal.find(dog.id) # Renverra un objet Dog
Associations polymorphes
Les associations polymorphes sont utilisées lorsqu'un modèle peut appartenir à différents autres modèles.
-
Ajout des colonnes
_idet_typedans le modèle associé: Par exemple, siCommentpeut appartenir àArticleouPhoto:# migration create_table :comments do |t| t.text :body t.references :commentable, polymorphic: true, null: false t.timestamps end -
Déclaration de l'association dans les modèles: Dans le modèle
Comment:# app/models/comment.rb class Comment < ApplicationRecord belongs_to :commentable, polymorphic: true endDans les modèles
ArticleetPhoto:# 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 -
Utilisation:
# console article = Article.create(title: "Rails Tips") photo = Photo.create(caption: "Coucher de soleil magnifique") article.comments.create(body: "Super article!") photo.comments.create(body: "Belle photo!") Comment.first.commentable # Renverra un Article Comment.last.commentable # Renverra une Photo
Le choix entre STI et associations polymorphes dépend de la structure des données et des relations entre modèles. STI pour les relations "est-un" (Dog est un Animal), associations polymorphes pour les relations "a-un" (Article a un Comment, Photo a un Comment, où Comment peut appartenir à Article OU Photo).