Sobes.tech
Middle+

როგორ განვახორციელოთ მოდელების მემკვიდრეობა ან პოლიმორფული კავშირები Ruby on Rails-ში?

sobes.tech AI

პასუხი AI-სგან

Ruby on Rails- ში მოდელების მემკვიდრეობა რეალიზებულია Single Table Inheritance (STI) ან პოლიმორფული კავშირების საშუალებით.

Single Table Inheritance (STI)

STI არის შესაფერისი, როდესაც სხვადასხვა ტიპის ობიექტებს აქვთ მსგავსი ატრიბუტები, მაგრამ განსხვავებული ქცევა. ყველა მონაცემი ინახება ერთ ცხრილში, ხოლო ობიექტის ტიპი განსაზღვრულია type სვეტით.

  1. ცხრილის და type სვეტის შექმნა:

    # მიგრაცია
    create_table :animals do |t|
      t.string :name
      t.string :type
      t.timestamps
    end
    
  2. ძირითადი კლასი და მემკვიდრეობითი მოდელები:

    # 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
    
  3. გამოყენება:

    # კონსოლში
    dog = Dog.create(name: "Buddy")
    cat = Cat.create(name: "Whiskers")
    
    animal = Animal.find(dog.id) # აბრუნებს Dog ობიექტს
    

პოლიმორფული კავშირები

პოლიმორფული კავშირები გამოიყენება, როდესაც მოდელი შეიძლება მიეკუთვნოს მრავალ სხვა მოდელს.

  1. _id და _type სვეტების დამატება კავშირში მყოფ მოდელში: მაგალითად, თუ Comment შეიძლება მიეკუთვნოს Article ან Photo:

    # მიგრაცია
    create_table :comments do |t|
      t.text :body
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
    
  2. კავშირების გამოცხადება მოდელებში: Comment მოდელში:

    # app/models/comment.rb
    class Comment < ApplicationRecord
      belongs_to :commentable, polymorphic: true
    end
    

    Article და 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
    
  3. გამოყენება:

    # კონსოლში
    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).