Sobes.tech
Middle+

Ruby on Railsda modellarning merosxo'rligi yoki polimorfik aloqalarni qanday amalga oshirish mumkin?

sobes.tech AI

AIdan javob

Ruby on Rails'da modellarning merosxo'rligi Single Table Inheritance (STI) yoki polimorfik aloqalar orqali amalga oshiriladi.

Single Table Inheritance (STI)

STI turli ob'ekt turlari o'xshash atributlarga ega, ammo turli xulq-atvorlarga ega bo'lsa, mos keladi. Barcha ma'lumotlar bitta jadvalda saqlanadi va ob'ekt turi type ustuni orqali aniqlanadi.

  1. Jadval va type ustunini yaratish:

    # migration
    create_table :animals do |t|
      t.string :name
      t.string :type
      t.timestamps
    end
    
  2. Asosiy klassdan meros olgan modellarning yaratilishi:

    # app/models/animal.rb
    class Animal < ApplicationRecord
      # Umumiy logika
    end
    
    # app/models/dog.rb
    class Dog < Animal
      # Itlar uchun maxsus logika
      def bark
        "Woof!"
      end
    end
    
    # app/models/cat.rb
    class Cat < Animal
      # Mushuklar uchun maxsus logika
      def meow
        "Meow!"
      end
    end
    
  3. Foydalanish:

    # konsol
    dog = Dog.create(name: "Buddy")
    cat = Cat.create(name: "Whiskers")
    
    animal = Animal.find(dog.id) # Dog ob'ekti qaytaradi
    

Polimorfik aloqalar

Polimorfik aloqalar, model turli xil boshqa modellarga tegishli bo'lishi mumkin bo'lsa, ishlatiladi.

  1. Aloqador modelda _id va _type ustunlarini qo'shish: Masalan, Comment Article yoki Photo ga tegishli bo'lishi mumkin:

    # migration
    create_table :comments do |t|
      t.text :body
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
    
  2. Modellarda aloqani e'lon qilish: Comment modelida:

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

    Article va Photo modellarda:

    # 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. Foydalanish:

    # konsol
    article = Article.create(title: "Rails Maslahatlari")
    photo = Photo.create(caption: "Go'zal quyosh botishi")
    
    article.comments.create(body: "Ajoyib maqola!")
    photo.comments.create(body: "Chiroyli foto!")
    
    Comment.first.commentable # Article qaytaradi
    Comment.last.commentable  # Photo qaytaradi
    

STI va polimorfik aloqalar orasidagi tanlov, ma'lumotlar tuzilmasi va modellarning o'rtasidagi munosabatlarga bog'liq. STI "bir-ani" munosabatlar uchun (Dog bir Animal), polimorfik aloqalar esa "bor" munosabatlar uchun (Article bor Comment, Photo bor Comment, Comment tegishli bo'lishi mumkin Article yoki Photo).