Polimorfismo con Ruby On Rails.
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!