Jak zaimplementować dziedziczenie modeli lub polimorficzne asocjacje w Ruby on Rails?
sobes.tech AI
Odpowiedź od AI
W Ruby on Rails dziedziczenie modeli realizuje się za pomocą Single Table Inheritance (STI) lub za pomocą polimorficznych asocjacji.
Single Table Inheritance (STI)
STI jest odpowiednie, gdy różne typy obiektów mają podobne atrybuty, ale różne zachowania. Wszystkie dane są przechowywane w jednej tabeli, a typ obiektu jest określany przez kolumnę type.
-
Tworzenie tabeli i kolumny
type:# migracja create_table :animals do |t| t.string :name t.string :type t.timestamps end -
Tworzenie klas modeli dziedziczących z klasy bazowej:
# app/models/animal.rb class Animal < ApplicationRecord # Logika wspólna dla wszystkich zwierząt end # app/models/dog.rb class Dog < Animal # Logika specyficzna dla psów def bark "Woof!" end end # app/models/cat.rb class Cat < Animal # Logika specyficzna dla kotów def meow "Meow!" end end -
Użycie:
# konsola dog = Dog.create(name: "Buddy") cat = Cat.create(name: "Whiskers") animal = Animal.find(dog.id) # Zwróci obiekt Dog
Polimorficzne asocjacje
Polimorficzne asocjacje są używane, gdy model może należeć do różnych innych modeli.
-
Dodanie kolumn
_idi_typedo modelu powiązanego: Na przykład, jeśliCommentmoże należeć doArticlelubPhoto:# migracja create_table :comments do |t| t.text :body t.references :commentable, polymorphic: true, null: false t.timestamps end -
Deklaracja asocjacji w modelach: W modelu
Comment:# app/models/comment.rb class Comment < ApplicationRecord belongs_to :commentable, polymorphic: true endW modelach
ArticleiPhoto:# 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 -
Użycie:
# konsola article = Article.create(title: "Porady Rails") photo = Photo.create(caption: "Piękny zachód słońca") article.comments.create(body: "Świetny artykuł!") photo.comments.create(body: "Piękne zdjęcie!") Comment.first.commentable # Zwróci Article Comment.last.commentable # Zwróci Photo
Wybór między STI a polimorficznymi asocjacjami zależy od struktury danych i relacji między modelami. STI dla relacji "jest-a" (Dog jest Animal), polimorficzne asocjacje dla relacji "ma-a" (Article ma Comment, Photo ma Comment, gdzie Comment może należeć do Article LUB Photo).