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.
-
Erstellung der Tabelle und der
type-Spalte:# Migration create_table :animals do |t| t.string :name t.string :type t.timestamps end -
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 -
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.
-
Hinzufügen der
_id- und_type-Spalten im assoziierten Modell: Zum Beispiel, wennCommentzuArticleoderPhotogehören kann:# Migration create_table :comments do |t| t.text :body t.references :commentable, polymorphic: true, null: false t.timestamps end -
Deklaration der Assoziation in den Modellen: Im Modell
Comment:# app/models/comment.rb class Comment < ApplicationRecord belongs_to :commentable, polymorphic: true endIn den Modellen
ArticleundPhoto:# 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 -
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).