Come implementare l'ereditarietà dei modelli o associazioni polimorfe in Ruby on Rails?
sobes.tech AI
Risposta dell'AI
In Ruby on Rails, l'ereditarietà dei modelli viene implementata tramite l'ereditarietà di tabella singola (STI) o tramite associazioni polimorfe.
Ereditarietà di Tabella Singola (STI)
STI è adatta quando diversi tipi di oggetti hanno attributi simili ma comportamenti diversi. Tutti i dati sono memorizzati in una singola tabella, e il tipo di oggetto è determinato dalla colonna type.
-
Creazione della tabella e della colonna
type:# migration create_table :animals do |t| t.string :name t.string :type t.timestamps end -
Creazione di classi modello che ereditano da una base:
# app/models/animal.rb class Animal < ApplicationRecord # Logica comune a tutti gli animali end # app/models/dog.rb class Dog < Animal # Logica specifica per i cani def bark "Woof!" end end # app/models/cat.rb class Cat < Animal # Logica specifica per i gatti def meow "Meow!" end end -
Utilizzo:
# console dog = Dog.create(name: "Buddy") cat = Cat.create(name: "Whiskers") animal = Animal.find(dog.id) # Restituirà un oggetto Dog
Associazioni polimorfe
Le associazioni polimorfe vengono usate quando un modello può appartenere a diversi altri modelli.
-
Aggiunta di colonne
_ide_typenel modello associato: Per esempio, seCommentpuò appartenere aArticleoPhoto:# migration create_table :comments do |t| t.text :body t.references :commentable, polymorphic: true, null: false t.timestamps end -
Dichiarazione dell'associazione nei modelli: Nel modello
Comment:# app/models/comment.rb class Comment < ApplicationRecord belongs_to :commentable, polymorphic: true endNei modelli
ArticleePhoto:# 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 -
Utilizzo:
# console article = Article.create(title: "Consigli di Rails") photo = Photo.create(caption: "Tramonto bellissimo") article.comments.create(body: "Ottimo articolo!") photo.comments.create(body: "Bella foto!") Comment.first.commentable # Restituirà un Article Comment.last.commentable # Restituirà un Photo
La scelta tra STI e associazioni polimorfe dipende dalla struttura dei dati e dalle relazioni tra i modelli. STI per relazioni "è-un" (Dog è un Animal), associazioni polimorfe per relazioni "ha-un" (Article ha un Comment, Photo ha un Comment, dove Comment può appartenere a Article O Photo).