Sobes.tech
Middle+

Hogyan valósítható meg a modellek öröklése vagy a polimorf kapcsolatok Ruby on Rails-ben?

sobes.tech MI

Válasz az MI-től

Ruby on Rails-ban a modellek öröklése Single Table Inheritance (STI) vagy polimorf kapcsolatok segítségével valósul meg.

Single Table Inheritance (STI)

Az STI akkor hasznos, ha különböző típusú objektumok hasonló attribútumokkal rendelkeznek, de különböző viselkedést mutatnak. Minden adat egyetlen táblában tárolódik, és az objektum típusa a type oszlop segítségével határozható meg.

  1. Táblázat és type oszlop létrehozása:

    # migráció
    create_table :animals do |t|
      t.string :name
      t.string :type
      t.timestamps
    end
    
  2. Modellek létrehozása, amelyek egy alapmodellből öröklődnek:

    # app/models/animal.rb
    class Animal < ApplicationRecord
      # Általános logika minden állatra
    end
    
    # app/models/dog.rb
    class Dog < Animal
      # Különleges logika kutyák számára
      def bark
        "Woof!"
      end
    end
    
    # app/models/cat.rb
    class Cat < Animal
      # Különleges logika macskák számára
      def meow
        "Meow!"
      end
    end
    
  3. Használat:

    # konzol
    dog = Dog.create(name: "Buddy")
    cat = Cat.create(name: "Whiskers")
    
    animal = Animal.find(dog.id) # Egy Dog objektumot ad vissza
    

Polimorf kapcsolatok

A polimorf kapcsolatok akkor hasznosak, ha egy modell több más modellhez is tartozhat.

  1. A kapcsolódó modellben _id és _type oszlopok hozzáadása: Például, ha a Comment tartozhat Article-hoz vagy Photo-hoz:

    # migráció
    create_table :comments do |t|
      t.text :body
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
    
  2. A modellekben a kapcsolat deklarálása: A Comment modellben:

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

    Az Article és Photo modellekben:

    # 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. Használat:

    # konzol
    article = Article.create(title: "Rails Tippek")
    photo = Photo.create(caption: "Szép naplemente")
    
    article.comments.create(body: "Remek cikk!")
    photo.comments.create(body: "Gyönyörű fotó!")
    
    Comment.first.commentable # Article-t ad vissza
    Comment.last.commentable  # Photo-t ad vissza
    

A STI és a polimorf kapcsolatok közötti választás a modellek közötti adatszerkezet és kapcsolatok függvénye. STI az "is-a" típusú kapcsolatokhoz (Dog is a Animal), polimorf kapcsolatok az "has-a" típusú kapcsolatokhoz (Article has a Comment, Photo has a Comment, ahol Comment tartozik Article-hez VAGY Photo-hoz).