Sobes.tech
Middle+

Kaip įgyvendinti modelių paveldėjimą arba polimorfiškas asociacijas Ruby on Rails?

sobes.tech AI

Atsakymas iš AI

Ruby on Rails modelių paveldėjimas realizuojamas per Single Table Inheritance (STI) arba naudojant polimorfiškas asociacijas.

Single Table Inheritance (STI)

STI yra tinkamas, kai skirtingų tipų objektai turi panašius atributus, bet skirtingą elgesį. Visi duomenys saugomi vienoje lentelėje, o objekto tipas nustatomas pagal stulpelį type.

  1. Lentelės ir type stulpelio sukūrimas:

    # migracija
    create_table :animals do |t|
      t.string :name
      t.string :type
      t.timestamps
    end
    
  2. Pagrindinio ir paveldinčių modelių kūrimas:

    # app/models/animal.rb
    class Animal < ApplicationRecord
      # Bendra logika visiems gyvūnams
    end
    
    # app/models/dog.rb
    class Dog < Animal
      # Specifinė logika šunims
      def bark
        "Woof!"
      end
    end
    
    # app/models/cat.rb
    class Cat < Animal
      # Specifinė logika katėms
      def meow
        "Meow!"
      end
    end
    
  3. Naudojimas:

    # konsolėje
    dog = Dog.create(name: "Buddy")
    cat = Cat.create(name: "Whiskers")
    
    animal = Animal.find(dog.id) # Grąžins Dog objektą
    

Polimorfiškos asociacijos

Polimorfiškos asociacijos naudojamos, kai modelis gali priklausyti skirtingiems kitų modelių tipams.

  1. Pridėti _id ir _type stulpelius susijusiame modelyje: Pavyzdžiui, jei Comment gali priklausyti Article arba Photo:

    # migracija
    create_table :comments do |t|
      t.text :body
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
    
  2. Asociacijų deklaravimas modeliuose: Comment modelyje:

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

    Article ir Photo modeliuose:

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

    # konsolėje
    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 # Grąžins Article
    Comment.last.commentable  # Grąžins Photo
    

Pasirinkimas tarp STI ir polimorfiškų asociacijų priklauso nuo duomenų struktūros ir ryšių tarp modelių. STI tinka "is-a" santykiams (Dog yra Animal), o polimorfiškos asociacijos — "has-a" santykiams (Article turi Comment, Photo turi Comment, kur Comment gali priklausyti Article arba Photo).