Ako implementovať dedičstvo modelov alebo polymorfné asociácie v Ruby on Rails?
sobes.tech AI
Odpoveď od AI
V Ruby on Rails dedičstvo modelov je realizované prostredníctvom Single Table Inheritance (STI) alebo pomocou polymorfných asociácií.
Single Table Inheritance (STI)
STI je vhodné, keď rôzne typy objektov majú podobné atribúty, ale odlišné správanie. Všetky údaje sú uložené v jednej tabuľke a typ objektu je určený podľa stĺpca type.
-
Vytvorenie tabuľky a stĺpca
type:# migrácia create_table :animals do |t| t.string :name t.string :type t.timestamps end -
Vytvorenie modelových tried, ktoré dedičia od základnej:
# app/models/animal.rb class Animal < ApplicationRecord # Všeobecná logika pre všetky zvieratá end # app/models/dog.rb class Dog < Animal # Špecifická logika pre psy def bark "Woof!" end end # app/models/cat.rb class Cat < Animal # Špecifická logika pre mačky def meow "Meow!" end end -
Použitie:
# konzola dog = Dog.create(name: "Buddy") cat = Cat.create(name: "Whiskers") animal = Animal.find(dog.id) # Vráti objekt Dog
Polymorfné asociácie
Polymorfné asociácie sa používajú, keď model môže patriť rôznym ďalším modelom.
-
Pridanie stĺpcov
_ida_typedo asociovaného modelu: Napríklad, akCommentmôže patriťArticlealeboPhoto:# migrácia create_table :comments do |t| t.text :body t.references :commentable, polymorphic: true, null: false t.timestamps end -
Deklarácia asociácie v modeloch: V modeli
Comment:# app/models/comment.rb class Comment < ApplicationRecord belongs_to :commentable, polymorphic: true endV modeloch
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žitie:
# konzola 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áti Article Comment.last.commentable # Vráti Photo
Voľba medzi STI a polymorfnými asociáciami závisí od štruktúry dát a vzťahov medzi modelmi. STI je vhodné pre "is-a" vzťahy (Dog je Animal), polymorfná asociácia pre "has-a" vzťahy (Article má Comment, Photo má Comment, kde Comment môže patriť na Article alebo Photo).