Sobes.tech
Middle+

Kā īstenot modeļu mantošanu vai polimorfās asociācijas Ruby on Rails?

sobes.tech AI

Atbilde no AI

Ruby on Rails modeļu mantošana tiek īstenota, izmantojot Single Table Inheritance (STI) vai ar polimorfiskām asociācijām.

Single Table Inheritance (STI)

STI ir piemērots, kad dažādu tipu objektiem ir līdzīgi atribūti, bet atšķirīga uzvedība. Visi dati tiek glabāti vienā tabulā, un objekta tips tiek noteikts pēc kolonnas type.

  1. Tabulas un type kolonnas izveide:

    # migrācija
    create_table :animals do |t|
      t.string :name
      t.string :type
      t.timestamps
    end
    
  2. Galvenā un mantojošo modeļu izveide:

    # app/models/animal.rb
    class Animal < ApplicationRecord
      # Vispārīga loģika visiem dzīvniekiem
    end
    
    # app/models/dog.rb
    class Dog < Animal
      # Īpaša loģika suņiem
      def bark
        "Woof!"
      end
    end
    
    # app/models/cat.rb
    class Cat < Animal
      # Īpaša loģika kaķiem
      def meow
        "Meow!"
      end
    end
    
  3. Lietošanas piemērs:

    # konsolē
    dog = Dog.create(name: "Buddy")
    cat = Cat.create(name: "Whiskers")
    
    animal = Animal.find(dog.id) # Atgriež Dog objektu
    

Polimorfiskas asociācijas

Polimorfiskas asociācijas tiek izmantotas, kad modelis var piederēt dažādiem citiem modeļiem.

  1. Pievienot _id un _type kolonnas saistītajam modelim: Piemēram, ja Comment var piederēt Article vai Photo:

    # migrācija
    create_table :comments do |t|
      t.text :body
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
    
  2. Apsaimniekošanas deklarācija modeļos: Comment modelī:

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

    Article un Photo modeļos:

    # 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. Lietošanas piemērs:

    # konsolē
    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 # Atgriež Article
    Comment.last.commentable  # Atgriež Photo
    

Izvēle starp STI un polimorfiskajām asociācijām ir atkarīga no datu struktūras un modeļu attiecībām. STI ir piemērots "is-a" attiecībām (Dog ir Animal), bet polimorfiskas asociācijas — "has-a" attiecībām (Article ir Comment, Photo ir Comment, kur Comment var piederēt Article vai Photo).