როგორ განვახორციელოთ მოდელების მემკვიდრეობა ან პოლიმორფული კავშირები Ruby on Rails-ში?
sobes.tech AI
პასუხი AI-სგან
Ruby on Rails- ში მოდელების მემკვიდრეობა რეალიზებულია Single Table Inheritance (STI) ან პოლიმორფული კავშირების საშუალებით.
Single Table Inheritance (STI)
STI არის შესაფერისი, როდესაც სხვადასხვა ტიპის ობიექტებს აქვთ მსგავსი ატრიბუტები, მაგრამ განსხვავებული ქცევა. ყველა მონაცემი ინახება ერთ ცხრილში, ხოლო ობიექტის ტიპი განსაზღვრულია type სვეტით.
-
ცხრილის და
typeსვეტის შექმნა:# მიგრაცია create_table :animals do |t| t.string :name t.string :type t.timestamps end -
ძირითადი კლასი და მემკვიდრეობითი მოდელები:
# app/models/animal.rb class Animal < ApplicationRecord # საერთო ლოგიკა ყველა ცხოველისთვის end # app/models/dog.rb class Dog < Animal # სპეციფიკური ლოგიკა ძაღლებისთვის def bark "Woof!" end end # app/models/cat.rb class Cat < Animal # სპეციფიკური ლოგიკა კატებისთვის def meow "Meow!" end end -
გამოყენება:
# კონსოლში dog = Dog.create(name: "Buddy") cat = Cat.create(name: "Whiskers") animal = Animal.find(dog.id) # აბრუნებს Dog ობიექტს
პოლიმორფული კავშირები
პოლიმორფული კავშირები გამოიყენება, როდესაც მოდელი შეიძლება მიეკუთვნოს მრავალ სხვა მოდელს.
-
_idდა_typeსვეტების დამატება კავშირში მყოფ მოდელში: მაგალითად, თუCommentშეიძლება მიეკუთვნოსArticleანPhoto:# მიგრაცია create_table :comments do |t| t.text :body t.references :commentable, polymorphic: true, null: false t.timestamps end -
კავშირების გამოცხადება მოდელებში:
Commentმოდელში:# app/models/comment.rb class Comment < ApplicationRecord belongs_to :commentable, polymorphic: true endArticleდაPhotoმოდელებში:# 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 -
გამოყენება:
# კონსოლში 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 # Article-ს აბრუნებს Comment.last.commentable # Photo-ს აბრუნებს
STI და პოლიმორფული კავშირების არჩევანი დამოკიდებულია მონაცემების სტრუქტურაზე და მოდელებს შორის ურთიერთობებზე. STI სასარგებლოა "is-a" ურთიერთობებისთვის (Dog არის Animal), პოლიმორფული კავშირები კი — "has-a" ურთიერთობებისთვის (Article აქვს Comment, Photo აქვს Comment, სადაც Comment შეიძლება მოეკუთვნოდეს Article ან Photo).