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.
-
Aanmaken van de tabel en de
type-kolom:# migratie create_table :animals do |t| t.string :name t.string :type t.timestamps end -
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 -
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.
-
Toevoegen van
_iden_typekolommen in het geassocieerde model: Bijvoorbeeld, alsCommentkan behoren totArticleofPhoto:# migratie create_table :comments do |t| t.text :body t.references :commentable, polymorphic: true, null: false t.timestamps end -
Declaratie van de associatie in de modellen: In het
Comment-model:# app/models/comment.rb class Comment < ApplicationRecord belongs_to :commentable, polymorphic: true endIn de
ArticleenPhotomodellen:# 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 -
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).