Sobes.tech
Middle+

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.

  1. Creazione della tabella e della colonna type:

    # migration
    create_table :animals do |t|
      t.string :name
      t.string :type
      t.timestamps
    end
    
  2. 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
    
  3. 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.

  1. Aggiunta di colonne _id e _type nel modello associato: Per esempio, se Comment può appartenere a Article o Photo:

    # migration
    create_table :comments do |t|
      t.text :body
      t.references :commentable, polymorphic: true, null: false
      t.timestamps
    end
    
  2. Dichiarazione dell'associazione nei modelli: Nel modello Comment:

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

    Nei modelli Article e 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. 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).