Sobes.tech
Middle+

Πώς υλοποιείτε την κληρονομικότητα μοντέλων ή τις πολύμορφες συσχετίσεις στο Ruby on Rails;

sobes.tech AI

Απάντηση από AI

Στο Ruby on Rails, η κληρονομικότητα των μοντέλων υλοποιείται μέσω Single Table Inheritance (STI) ή μέσω πολυμορφικών συσχετίσεων.

Single Table Inheritance (STI)

Το STI είναι κατάλληλο όταν διαφορετικοί τύποι αντικειμένων έχουν παρόμοια χαρακτηριστικά, αλλά διαφορετική συμπεριφορά. Όλα τα δεδομένα αποθηκεύονται σε έναν πίνακα, και ο τύπος του αντικειμένου καθορίζεται από τη στήλη type.

  1. Δημιουργία πίνακα και στήλης type:

    # migration
    create_table :animals do |t|
      t.string :name
      t.string :type
      t.timestamps
    end
    
  2. Δημιουργία κλάσεων μοντέλων που κληρονομούν από μια βασική:

    # app/models/animal.rb
    class Animal < ApplicationRecord
      # Κοινή λογική για όλα τα ζώα
    end
    
    # app/models/dog.rb
    class Dog < Animal
      # Συγκεκριμένη λογική για τους σκύλους
      def bark
        "Woof!"
      end
    end
    
    # app/models/cat.rb
    class Cat < Animal
      # Συγκεκριμένη λογική για τις γάτες
      def meow
        "Meow!"
      end
    end
    
  3. Χρήση:

    # κονσόλα
    dog = Dog.create(name: "Buddy")
    cat = Cat.create(name: "Whiskers")
    
    animal = Animal.find(dog.id) # Θα επιστρέψει ένα αντικείμενο Dog
    

Πολυμορφικές συσχετίσεις

Οι πολυμορφικές συσχετίσεις χρησιμοποιούνται όταν ένα μοντέλο μπορεί να ανήκει σε διαφορετικά άλλα μοντέλα.

  1. Προσθήκη στηλών _id και _type στο συσχετιζόμενο μοντέλο: Για παράδειγμα, αν το Comment μπορεί να ανήκει σε Article ή Photo:

    # migration
    create_table :comments do |t|
      t.text :body
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
    
  2. Δήλωση της συσχέτισης στα μοντέλα: Στο μοντέλο Comment:

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

    Στα μοντέλα Article και 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. Χρήση:

    # κονσόλα
    article = Article.create(title: "Rails Tips")
    photo = Photo.create(caption: "Όμορφο ηλιοβασίλεμα")
    
    article.comments.create(body: "Άρθρο εξαιρετικό!")
    photo.comments.create(body: "Όμορφη φωτογραφία!")
    
    Comment.first.commentable # Θα επιστρέψει ένα Article
    Comment.last.commentable  # Θα επιστρέψει ένα Photo
    

Η επιλογή μεταξύ STI και πολυμορφικών συσχετίσεων εξαρτάται από τη δομή των δεδομένων και τις σχέσεις μεταξύ των μοντέλων. Το STI χρησιμοποιείται για "είναι-ένα" σχέσεις (Dog είναι ένα Animal), οι πολυμορφικές συσχετίσεις για "έχει-ένα" σχέσεις (Article έχει ένα Comment, Photo έχει ένα Comment, όπου το Comment ανήκει σε Article Ή Photo).