Sobes.tech
Middle+

Wie implementiert man Modellvererbung oder polymorphe Assoziationen in Ruby on Rails?

sobes.tech KI

Antwort von AI

In Ruby on Rails wird die Modellvererbung durch Single Table Inheritance (STI) oder durch polymorphe Assoziationen realisiert.

Single Table Inheritance (STI)

STI ist geeignet, wenn verschiedene Objekttypen ähnliche Attribute haben, aber unterschiedliches Verhalten. Alle Daten werden in einer Tabelle gespeichert, und der Objekttyp wird durch die Spalte type bestimmt.

  1. Erstellung der Tabelle und der type-Spalte:

    # Migration
    create_table :animals do |t|
      t.string :name
      t.string :type
      t.timestamps
    end
    
  2. Erstellung von Modellklassen, die von einer Basisklasse erben:

    # app/models/animal.rb
    class Animal < ApplicationRecord
      # Gemeinsame Logik für alle Tiere
    end
    
    # app/models/dog.rb
    class Dog < Animal
      # Spezifische Logik für Hunde
      def bark
        "Woof!"
      end
    end
    
    # app/models/cat.rb
    class Cat < Animal
      # Spezifische Logik für Katzen
      def meow
        "Meow!"
      end
    end
    
  3. Verwendung:

    # Konsole
    dog = Dog.create(name: "Buddy")
    cat = Cat.create(name: "Whiskers")
    
    animal = Animal.find(dog.id) # Gibt ein Dog-Objekt zurück
    

Polymorphe Assoziationen

Polymorphe Assoziationen werden verwendet, wenn ein Modell zu verschiedenen anderen Modellen gehören kann.

  1. Hinzufügen der _id- und _type-Spalten im assoziierten Modell: Zum Beispiel, wenn Comment zu Article oder Photo gehören kann:

    # Migration
    create_table :comments do |t|
      t.text :body
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
    
  2. Deklaration der Assoziation in den Modellen: Im Modell Comment:

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

    In den Modellen Article und 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. Verwendung:

    # Konsole
    article = Article.create(title: "Rails Tipps")
    photo = Photo.create(caption: "Schöner Sonnenuntergang")
    
    article.comments.create(body: "Toller Artikel!")
    photo.comments.create(body: "Schönes Foto!")
    
    Comment.first.commentable # Gibt einen Article zurück
    Comment.last.commentable  # Gibt ein Photo zurück
    

Die Wahl zwischen STI und polymorphen Assoziationen hängt von der Datenstruktur und den Beziehungen zwischen den Modellen ab. STI für "ist-ein"-Beziehungen (Dog ist ein Animal), polymorphe Assoziationen für "hat-ein"-Beziehungen (Article hat ein Comment, Photo hat ein Comment, wobei Comment zu Article ODER Photo gehört).