La potenza di un dato polimorfico è decisamente elevata perché permette di agganciare un dato ad un altro senza vincoli di dipendenza.

Nel mio caso su significatocanzone.it è possibile commentare tutta una serie di risorse. In prima battuta, per velocità di sviluppo, avevo creato delle colonne come song_id e annotation_id sulla tabella dei commenti (comments).

Ad un certo punto dato l’elevato numero di posti dove volevo inserire la possibilità di contribuire con dei commenti ho astratto il concetto attraverso il sistema polimorfico.

Per avere un sistema polimorfico è sufficiente aggiungere due colonne:

  • commentable_id
  • commentable_type

Il primo rappresenta l’id della risorsa esterna (ad esempio l’id di una canzone) mentre il secondo rappresenta la tipologia di tabella a cui si fa riferimento (ad esempio Song).

Rails una volta seguita questa impostazione impone di seguire la seguente convenzione:

class Comment < ApplicationRecord
  belongs_to :commentable, polymorphic: true
end

class Song < ApplicationRecord
  has_many :comments, as: :commentable
end

class Product < ApplicationRecord
  has_many :comments, as: :commentable
end

In questo modo i commenti possono essere assegnati a diverse tipologie di model / dato.

Fantastico!