Πώς υλοποιείτε την κληρονομικότητα μοντέλων ή τις πολύμορφες συσχετίσεις στο Ruby on Rails;
sobes.tech AI
Απάντηση από AI
Στο Ruby on Rails, η κληρονομικότητα των μοντέλων υλοποιείται μέσω Single Table Inheritance (STI) ή μέσω πολυμορφικών συσχετίσεων.
Single Table Inheritance (STI)
Το STI είναι κατάλληλο όταν διαφορετικοί τύποι αντικειμένων έχουν παρόμοια χαρακτηριστικά, αλλά διαφορετική συμπεριφορά. Όλα τα δεδομένα αποθηκεύονται σε έναν πίνακα, και ο τύπος του αντικειμένου καθορίζεται από τη στήλη type.
-
Δημιουργία πίνακα και στήλης
type:# migration create_table :animals do |t| t.string :name t.string :type t.timestamps end -
Δημιουργία κλάσεων μοντέλων που κληρονομούν από μια βασική:
# 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 -
Χρήση:
# κονσόλα dog = Dog.create(name: "Buddy") cat = Cat.create(name: "Whiskers") animal = Animal.find(dog.id) # Θα επιστρέψει ένα αντικείμενο Dog
Πολυμορφικές συσχετίσεις
Οι πολυμορφικές συσχετίσεις χρησιμοποιούνται όταν ένα μοντέλο μπορεί να ανήκει σε διαφορετικά άλλα μοντέλα.
-
Προσθήκη στηλών
_idκαι_typeστο συσχετιζόμενο μοντέλο: Για παράδειγμα, αν τοCommentμπορεί να ανήκει σεArticleήPhoto:# migration create_table :comments do |t| t.text :body t.references :commentable, polymorphic: true, null: false t.timestamps end -
Δήλωση της συσχέτισης στα μοντέλα: Στο μοντέλο
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 -
Χρήση:
# κονσόλα 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).