Sobes.tech
Middle+

Hoe implementeer je modelerfenheritance of polymorfe associaties in Ruby on Rails?

sobes.tech AI

Antwoord van AI

In Ruby on Rails wordt modelerfelijkheid geïmplementeerd via Single Table Inheritance (STI) of via polymorfe associaties.

Single Table Inheritance (STI)

STI is geschikt wanneer verschillende objecttypes vergelijkbare attributen hebben, maar verschillend gedrag. Alle gegevens worden opgeslagen in één tabel, en het objecttype wordt bepaald door de kolom type.

  1. Aanmaken van de tabel en de type-kolom:

    # migratie
    create_table :animals do |t|
      t.string :name
      t.string :type
      t.timestamps
    end
    
  2. Aanmaken van modelklassen die van een basisklasse erven:

    # app/models/animal.rb
    class Animal < ApplicationRecord
      # Gemeenschappelijke logica voor alle dieren
    end
    
    # app/models/dog.rb
    class Dog < Animal
      # Specifieke logica voor honden
      def bark
        "Woof!"
      end
    end
    
    # app/models/cat.rb
    class Cat < Animal
      # Specifieke logica voor katten
      def meow
        "Meow!"
      end
    end
    
  3. Gebruik:

    # console
    dog = Dog.create(name: "Buddy")
    cat = Cat.create(name: "Whiskers")
    
    animal = Animal.find(dog.id) # Geeft een Dog-object terug
    

Polymorfe associaties

Polymorfe associaties worden gebruikt wanneer een model kan behoren tot verschillende andere modellen.

  1. Toevoegen van _id en _type kolommen in het geassocieerde model: Bijvoorbeeld, als Comment kan behoren tot Article of Photo:

    # migratie
    create_table :comments do |t|
      t.text :body
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
    
  2. Declaratie van de associatie in de modellen: In het Comment-model:

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

    In de Article en Photo modellen:

    # 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. Gebruik:

    # console
    article = Article.create(title: "Rails Tips")
    photo = Photo.create(caption: "Prachtige zonsondergang")
    
    article.comments.create(body: "Geweldig artikel!")
    photo.comments.create(body: "Mooi foto!")
    
    Comment.first.commentable # Geeft een Article
    Comment.last.commentable  # Geeft een Photo
    

De keuze tussen STI en polymorfe associaties hangt af van de datastructuur en de relaties tussen modellen. STI voor "is-een" relaties (Dog is een Animal), polymorfe associaties voor "heeft-een" relaties (Article heeft een Comment, Photo heeft een Comment, waarbij Comment behoort tot Article OF Photo).