Sobes.tech
Middle+

Ako implementovať dedičstvo modelov alebo polymorfné asociácie v Ruby on Rails?

sobes.tech AI

Odpoveď od AI

V Ruby on Rails dedičstvo modelov je realizované prostredníctvom Single Table Inheritance (STI) alebo pomocou polymorfných asociácií.

Single Table Inheritance (STI)

STI je vhodné, keď rôzne typy objektov majú podobné atribúty, ale odlišné správanie. Všetky údaje sú uložené v jednej tabuľke a typ objektu je určený podľa stĺpca type.

  1. Vytvorenie tabuľky a stĺpca type:

    # migrácia
    create_table :animals do |t|
      t.string :name
      t.string :type
      t.timestamps
    end
    
  2. Vytvorenie modelových tried, ktoré dedičia od základnej:

    # app/models/animal.rb
    class Animal < ApplicationRecord
      # Všeobecná logika pre všetky zvieratá
    end
    
    # app/models/dog.rb
    class Dog < Animal
      # Špecifická logika pre psy
      def bark
        "Woof!"
      end
    end
    
    # app/models/cat.rb
    class Cat < Animal
      # Špecifická logika pre mačky
      def meow
        "Meow!"
      end
    end
    
  3. Použitie:

    # konzola
    dog = Dog.create(name: "Buddy")
    cat = Cat.create(name: "Whiskers")
    
    animal = Animal.find(dog.id) # Vráti objekt Dog
    

Polymorfné asociácie

Polymorfné asociácie sa používajú, keď model môže patriť rôznym ďalším modelom.

  1. Pridanie stĺpcov _id a _type do asociovaného modelu: Napríklad, ak Comment môže patriť Article alebo Photo:

    # migrácia
    create_table :comments do |t|
      t.text :body
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
    
  2. Deklarácia asociácie v modeloch: V modeli Comment:

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

    V modeloch Article a 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. Použitie:

    # konzola
    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 # Vráti Article
    Comment.last.commentable  # Vráti Photo
    

Voľba medzi STI a polymorfnými asociáciami závisí od štruktúry dát a vzťahov medzi modelmi. STI je vhodné pre "is-a" vzťahy (Dog je Animal), polymorfná asociácia pre "has-a" vzťahy (Article Comment, Photo Comment, kde Comment môže patriť na Article alebo Photo).