Le relazioni molti-a-molti sono l'unica opzione praticabile qui. C'è un motivo per cui lo chiamano database relazionale.
Come mai?
- Le iscrizioni in realtà non sono così costose.
- Più colonne - Il numero di colonne nelle tue tabelle sarà ridicolo e sarà un vero inferno per gli sviluppatori. Poiché ogni funzionalità aggiunge una migrazione, la quantità di abbandono nella tua base di codice sarà sciocca.
- Colonna array - L'utilizzo di una colonna array può sembrare un'alternativa interessante finché non ti rendi conto che in realtà è solo un miglioramento marginale rispetto all'inserimento di elementi in una stringa separata da virgole. non hai integrità referenziale e nessuno dei vantaggi dell'organizzazione del codice che derivano dall'avere modelli che rappresentano le entità nella tua applicazione.
Oh, e ogni volta che una funzionalità viene strappata devi aggiornare ognuno di quegli oltre 500.000 utenti. VS usando solo CASCADE.
class Feature
has_many :user_features
has_many :users, through: :user_features
end
class UserFeature
belongs_to :user
belongs_to :feature
end
class User
has_many :user_features
has_many :features, through: :user_features
def has_feature?(name)
features.exist?(name: name)
end
end