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):