Kaip įgyvendinti modelių paveldėjimą arba polimorfiškas asociacijas Ruby on Rails?
sobes.tech AI
Atsakymas iš AI
Ruby on Rails modelių paveldėjimas realizuojamas per Single Table Inheritance (STI) arba naudojant polimorfiškas asociacijas.
Single Table Inheritance (STI)
STI yra tinkamas, kai skirtingų tipų objektai turi panašius atributus, bet skirtingą elgesį. Visi duomenys saugomi vienoje lentelėje, o objekto tipas nustatomas pagal stulpelį type.
-
Lentelės ir
typestulpelio sukūrimas:# migracija create_table :animals do |t| t.string :name t.string :type t.timestamps end -
Pagrindinio ir paveldinčių modelių kūrimas:
# app/models/animal.rb class Animal < ApplicationRecord # Bendra logika visiems gyvūnams end # app/models/dog.rb class Dog < Animal # Specifinė logika šunims def bark "Woof!" end end # app/models/cat.rb class Cat < Animal # Specifinė logika katėms def meow "Meow!" end end -
Naudojimas:
# konsolėje dog = Dog.create(name: "Buddy") cat = Cat.create(name: "Whiskers") animal = Animal.find(dog.id) # Grąžins Dog objektą
Polimorfiškos asociacijos
Polimorfiškos asociacijos naudojamos, kai modelis gali priklausyti skirtingiems kitų modelių tipams.
-
Pridėti
_idir_typestulpelius susijusiame modelyje: Pavyzdžiui, jeiCommentgali priklausytiArticlearbaPhoto:# migracija create_table :comments do |t| t.text :body t.references :commentable, polymorphic: true, null: false t.timestamps end -
Asociacijų deklaravimas modeliuose:
Commentmodelyje:# app/models/comment.rb class Comment < ApplicationRecord belongs_to :commentable, polymorphic: true endArticleirPhotomodeliuose:# 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 -
Naudojimas:
# konsolėje 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 # Grąžins Article Comment.last.commentable # Grąžins Photo
Pasirinkimas tarp STI ir polimorfiškų asociacijų priklauso nuo duomenų struktūros ir ryšių tarp modelių. STI tinka "is-a" santykiams (Dog yra Animal), o polimorfiškos asociacijos — "has-a" santykiams (Article turi Comment, Photo turi Comment, kur Comment gali priklausyti Article arba Photo).