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га тиешелүү).