Sobes.tech
Middle+

Jak implementovat dědičnost modelů nebo polymorfní asociace v Ruby on Rails?

sobes.tech AI

Odpověď od AI

V Ruby on Rails dědění modelů je realizováno prostřednictvím Single Table Inheritance (STI) nebo pomocí polymorfních asociací.

Single Table Inheritance (STI)

STI je vhodné, když různé typy objektů mají podobné atributy, ale odlišné chování. Všechna data jsou uložena v jedné tabulce a typ objektu je určen podle sloupce type.

  1. Vytvoření tabulky a sloupce type:

    # migrace
    create_table :animals do |t|
      t.string :name
      t.string :type
      t.timestamps
    end
    
  2. Vytvoření modelových tříd dědících od základní:

    # app/models/animal.rb
    class Animal < ApplicationRecord
      # Obecná logika pro všechna zvířata
    end
    
    # app/models/dog.rb
    class Dog < Animal
      # Specifická logika pro psy
      def bark
        "Woof!"
      end
    end
    
    # app/models/cat.rb
    class Cat < Animal
      # Specifická logika pro kočky
      def meow
        "Meow!"
      end
    end
    
  3. Použití:

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

Polymorfní asociace

Polymorfní asociace se používají, když model může patřit různým dalším modelům.

  1. Přidání sloupců _id a _type do asociované modelu: Například, pokud Comment může patřit Article nebo Photo:

    # migrace
    create_table :comments do |t|
      t.text :body
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
    
  2. Deklarace asociace v modelech: V modelu Comment:

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

    V modelech 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žití:

    # konzole
    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átí Article
    Comment.last.commentable  # Vrátí Photo
    

Volba mezi STI a polymorfními asociacemi závisí na struktuře dat a vztazích mezi modely. STI je vhodné pro "is-a" vztahy (Dog je Animal), polymorfní asociace pro "has-a" vztahy (Article Comment, Photo Comment, kde Comment může patřit Article nebo Photo).