Jak implementovat dědičnost modelů nebo polymorfní asociace v Ruby on Rails?
sobes.tech AI
Odpověď od AI
V Ruby on Rails dědění modelů je realizováno prostřednictvím Single Table Inheritance (STI) nebo pomocí polymorfních asociací.
Single Table Inheritance (STI)
STI je vhodné, když různé typy objektů mají podobné atributy, ale odlišné chování. Všechna data jsou uložena v jedné tabulce a typ objektu je určen podle sloupce type.
-
Vytvoření tabulky a sloupce
type:# migrace create_table :animals do |t| t.string :name t.string :type t.timestamps end -
Vytvoření modelových tříd dědících od základní:
# app/models/animal.rb class Animal < ApplicationRecord # Obecná logika pro všechna zvířata end # app/models/dog.rb class Dog < Animal # Specifická logika pro psy def bark "Woof!" end end # app/models/cat.rb class Cat < Animal # Specifická logika pro kočky def meow "Meow!" end end -
Použití:
# konzole dog = Dog.create(name: "Buddy") cat = Cat.create(name: "Whiskers") animal = Animal.find(dog.id) # Vrátí objekt Dog
Polymorfní asociace
Polymorfní asociace se používají, když model může patřit různým dalším modelům.
-
Přidání sloupců
_ida_typedo asociované modelu: Například, pokudCommentmůže patřitArticleneboPhoto:# migrace create_table :comments do |t| t.text :body t.references :commentable, polymorphic: true, null: false t.timestamps end -
Deklarace asociace v modelech: V modelu
Comment:# app/models/comment.rb class Comment < ApplicationRecord belongs_to :commentable, polymorphic: true endV modelech
ArticleaPhoto:# 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 -
Použití:
# konzole article = Article.create(title: "Rails Tips") photo = Photo.create(caption: "Beautiful Sunset") article.comments.create(body: "Great article!") photo.comments.create(body: "Lovely photo!") Comment.first.commentable # Vrátí Article Comment.last.commentable # Vrátí Photo
Volba mezi STI a polymorfními asociacemi závisí na struktuře dat a vztazích mezi modely. STI je vhodné pro "is-a" vztahy (Dog je Animal), polymorfní asociace pro "has-a" vztahy (Article má Comment, Photo má Comment, kde Comment může patřit Article nebo Photo).