Hogyan valósítható meg a modellek öröklése vagy a polimorf kapcsolatok Ruby on Rails-ben?
sobes.tech MI
Válasz az MI-től
Ruby on Rails-ban a modellek öröklése Single Table Inheritance (STI) vagy polimorf kapcsolatok segítségével valósul meg.
Single Table Inheritance (STI)
Az STI akkor hasznos, ha különböző típusú objektumok hasonló attribútumokkal rendelkeznek, de különböző viselkedést mutatnak. Minden adat egyetlen táblában tárolódik, és az objektum típusa a type oszlop segítségével határozható meg.
-
Táblázat és
typeoszlop létrehozása:# migráció create_table :animals do |t| t.string :name t.string :type t.timestamps end -
Modellek létrehozása, amelyek egy alapmodellből öröklődnek:
# app/models/animal.rb class Animal < ApplicationRecord # Általános logika minden állatra end # app/models/dog.rb class Dog < Animal # Különleges logika kutyák számára def bark "Woof!" end end # app/models/cat.rb class Cat < Animal # Különleges logika macskák számára def meow "Meow!" end end -
Használat:
# konzol dog = Dog.create(name: "Buddy") cat = Cat.create(name: "Whiskers") animal = Animal.find(dog.id) # Egy Dog objektumot ad vissza
Polimorf kapcsolatok
A polimorf kapcsolatok akkor hasznosak, ha egy modell több más modellhez is tartozhat.
-
A kapcsolódó modellben
_idés_typeoszlopok hozzáadása: Például, ha aCommenttartozhatArticle-hoz vagyPhoto-hoz:# migráció create_table :comments do |t| t.text :body t.references :commentable, polymorphic: true, null: false t.timestamps end -
A modellekben a kapcsolat deklarálása: A
Commentmodellben:# app/models/comment.rb class Comment < ApplicationRecord belongs_to :commentable, polymorphic: true endAz
ArticleésPhotomodellekben:# 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 -
Használat:
# konzol article = Article.create(title: "Rails Tippek") photo = Photo.create(caption: "Szép naplemente") article.comments.create(body: "Remek cikk!") photo.comments.create(body: "Gyönyörű fotó!") Comment.first.commentable # Article-t ad vissza Comment.last.commentable # Photo-t ad vissza
A STI és a polimorf kapcsolatok közötti választás a modellek közötti adatszerkezet és kapcsolatok függvénye. STI az "is-a" típusú kapcsolatokhoz (Dog is a Animal), polimorf kapcsolatok az "has-a" típusú kapcsolatokhoz (Article has a Comment, Photo has a Comment, ahol Comment tartozik Article-hez VAGY Photo-hoz).