Sobes.tech
Middle+

Ruby on Rails-də modellərin irsiyyəti və ya çoxformal əlaqələri necə həyata keçirmək olar?

sobes.tech Süni İntellekt

AI-dan cavab

Ruby on Rails-də modellərin irsiyyəti Single Table Inheritance (STI) və ya polimorfik əlaqələr vasitəsilə həyata keçirilir.

Single Table Inheritance (STI)

STI müxtəlif obyekt tiplərinin oxşar atributlara malik olduğu, lakin fərqli davranışlara sahib olduğu hallarda uyğundur. Bütün məlumatlar tək bir cədvəldə saxlanılır və obyekt tipi type sütunu ilə müəyyən edilir.

  1. Cədvəl və type sütununun yaradılması:

    # migration
    create_table :animals do |t|
      t.string :name
      t.string :type
      t.timestamps
    end
    
  2. Əsas sinifdən irsi olan modellərin yaradılması:

    # app/models/animal.rb
    class Animal < ApplicationRecord
      # Ümumi məntiq
    end
    
    # app/models/dog.rb
    class Dog < Animal
      # İti üçün xüsusi məntiq
      def bark
        "Woof!"
      end
    end
    
    # app/models/cat.rb
    class Cat < Animal
      # Pişik üçün xüsusi məntiq
      def meow
        "Meow!"
      end
    end
    
  3. İstifadə:

    # konsol
    dog = Dog.create(name: "Buddy")
    cat = Cat.create(name: "Whiskers")
    
    animal = Animal.find(dog.id) # Dog obyektini qaytarır
    

Polimorfik əlaqələr

Polimorfik əlaqələr, bir modelin fərqli digər modellərə aid ola biləcəyi hallarda istifadə olunur.

  1. Əlaqəli modeldə _id_type sütunlarının əlavə olunması: Məsələn, Comment Article və ya Photo-ya aid ola bilər:

    # migration
    create_table :comments do |t|
      t.text :body
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
    
  2. Modellərdə əlaqənin elan olunması: Comment modelində:

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

    ArticlePhoto modellərində:

    # 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. İstifadə:

    # konsol
    article = Article.create(title: "Rails Məsləhətləri")
    photo = Photo.create(caption: "Gözəl Gün Batımı")
    
    article.comments.create(body: "Əla məqalə!")
    photo.comments.create(body: "Gözəl foto!")
    
    Comment.first.commentable # Article qaytarır
    Comment.last.commentable  # Photo qaytarır
    

STI və polimorfik əlaqələr arasındakı seçim, məlumatların strukturu və modellər arasındakı münasibətlərdən asılıdır. STI "bir-şeydir" münasibətləri üçün (Dog bir Animal), polimorfik əlaqələr isə "sahibdir" münasibətləri üçün (Article sahibdir Comment, Photo sahibdir Comment, burada Comment aid edir Article və ya Photo-ya).