Sobes.tech
Middle+

Kuidas rakendada Ruby on Railsis mudelite pärandamist või polümorfilisi seoseid?

sobes.tech AI

Vastus AI-lt

Ruby on Rails mudelite pärimine realiseeritakse Single Table Inheritance (STI) või polümorfiliste seoste kaudu.

Single Table Inheritance (STI)

STI sobib olukordades, kus erinevat tüüpi objektidel on sarnased atribuudid, kuid erinev käitumine. Kõik andmed salvestatakse ühes tabelis ning objekti tüüp määratakse type veeru kaudu.

  1. Tabeli ja type veeru loomine:

    # migratsioon
    create_table :animals do |t|
      t.string :name
      t.string :type
      t.timestamps
    end
    
  2. Põhja- ja pärilikkusega mudelite loomine:

    # app/models/animal.rb
    class Animal < ApplicationRecord
      # Üldine loogika kõigile loomadele
    end
    
    # app/models/dog.rb
    class Dog < Animal
      # Spetsiifiline loogika koertele
      def bark
        "Woof!"
      end
    end
    
    # app/models/cat.rb
    class Cat < Animal
      # Spetsiifiline loogika kassidele
      def meow
        "Meow!"
      end
    end
    
  3. Kasutamine:

    # konsool
    dog = Dog.create(name: "Buddy")
    cat = Cat.create(name: "Whiskers")
    
    animal = Animal.find(dog.id) # Tagastab Dog objekti
    

Polümorfsed seosed

Polümorfsed seosed on kasulikud, kui mudel võib kuuluda erinevatele teistele mudelitele.

  1. _id ja _type veergude lisamine seotud mudelile: Näiteks, kui Comment võib kuuluda Article või Photo:

    # migratsioon
    create_table :comments do |t|
      t.text :body
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
    
  2. Seoste deklareerimine mudelites: Comment mudelis:

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

    Article ja Photo mudelites:

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

    # konsool
    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 # Tagastab Article
    Comment.last.commentable  # Tagastab Photo
    

Valik STI ja polümorfiliste seoste vahel sõltub andmestruktuurist ja mudelitevahelistest suhetest. STI sobib "is-a" suhete jaoks (Dog on Animal), polümorfilised seosed aga "has-a" suhete jaoks (Article omab Comment, Photo omab Comment, kus Comment võib kuuluda Article või Photo).