Kuidas rakendada Ruby on Railsis mudelite pärandamist või polümorfilisi seoseid?
sobes.tech AI
Vastus AI-lt
Ruby on Rails mudelite pärimine realiseeritakse Single Table Inheritance (STI) või polümorfiliste seoste kaudu.
Single Table Inheritance (STI)
STI sobib olukordades, kus erinevat tüüpi objektidel on sarnased atribuudid, kuid erinev käitumine. Kõik andmed salvestatakse ühes tabelis ning objekti tüüp määratakse type veeru kaudu.
-
Tabeli ja
typeveeru loomine:# migratsioon create_table :animals do |t| t.string :name t.string :type t.timestamps end -
Põhja- ja pärilikkusega mudelite loomine:
# app/models/animal.rb class Animal < ApplicationRecord # Üldine loogika kõigile loomadele end # app/models/dog.rb class Dog < Animal # Spetsiifiline loogika koertele def bark "Woof!" end end # app/models/cat.rb class Cat < Animal # Spetsiifiline loogika kassidele def meow "Meow!" end end -
Kasutamine:
# konsool dog = Dog.create(name: "Buddy") cat = Cat.create(name: "Whiskers") animal = Animal.find(dog.id) # Tagastab Dog objekti
Polümorfsed seosed
Polümorfsed seosed on kasulikud, kui mudel võib kuuluda erinevatele teistele mudelitele.
-
_idja_typeveergude lisamine seotud mudelile: Näiteks, kuiCommentvõib kuuludaArticlevõiPhoto:# migratsioon create_table :comments do |t| t.text :body t.references :commentable, polymorphic: true, null: false t.timestamps end -
Seoste deklareerimine mudelites:
Commentmudelis:# app/models/comment.rb class Comment < ApplicationRecord belongs_to :commentable, polymorphic: true endArticlejaPhotomudelites:# 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 -
Kasutamine:
# konsool 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 # Tagastab Article Comment.last.commentable # Tagastab Photo
Valik STI ja polümorfiliste seoste vahel sõltub andmestruktuurist ja mudelitevahelistest suhetest. STI sobib "is-a" suhete jaoks (Dog on Animal), polümorfilised seosed aga "has-a" suhete jaoks (Article omab Comment, Photo omab Comment, kus Comment võib kuuluda Article või Photo).