Sobes.tech
Middle+

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.

  1. 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
    
  2. 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
    
  3. 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.

  1. Ajout des colonnes _id et _type dans le modèle associé: Par exemple, si Comment peut appartenir à Article ou Photo:

    # migration
    create_table :comments do |t|
      t.text :body
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
    
  2. 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
    end
    

    Dans les modèles Article et 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. 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).