Quindi sto facendo un bug tracker per aiutarmi a imparare Ruby on Rails. La mia configurazione attuale è simile a questa:
- Ogni
Project
has_many :metadata
ehas_many :permissions, through: :metadata
. Anche alcune altre cose, ma questo è tutto ciò che è rilevante per questa domanda. - Ogni
Metadatum
(pessimo nome, lo so, ma funzionerà per ora)has_many :permissions
ebelongs_to
entrambi:project
e:person
. - Ogni
Permission
belongs_to :metadatum
e entrambihas_one :project, through: :metadatum
ehas_one :person, through: :metadatum
. Rappresenta una persona in grado di fare una cosa su un progetto - per esempio, aggiungere un nuovo bug, o assegnare qualcuno a un bug, ecc. Ecc.
Ora, la mia domanda è se questo è un buon modo per aggiungere diversi livelli di permessi che sono diversi per ogni progetto - così, per esempio, la Eva di Project Manager non può modificare i progetti di Project Manager Bob solo perché è un Anche PM e QA James non possono aggiungere molti bug a un progetto che non dovrebbe testare.
Per me ha senso perché ogni progetto ha metadati che si applicano a tutti (che è memorizzato in Project
) e metadati individuali per ogni persona (che è in Metadatum
e include cose come se l'hanno recitato o se gli hanno assegnato un nome personalizzato). Per me, è ragionevole che Metadatum
memorizzi anche il livello di autorizzazione, dal momento che dipende dal progetto e dalla persona entrambi.
Tuttavia, sono preoccupato per l'utilizzo dello spazio, anche se non so se dovrei esserlo. Sarebbe piuttosto banale cambiarlo per usare un po 'di magia bitmasking per fare la stessa cosa, ma la mia preoccupazione è che è meno leggibile e consente solo di aggiungere una certa quantità di autorizzazioni prima di esaurire la stanza in un numero. Sono anche preoccupato che ci vorrà più tempo per controllare se qualcuno è autorizzato a fare qualcosa oltre alla maschera di bit, perché invece di permission & 1<<12
devi controllare project.permissions.find_by(person: person, allows: :allowance)
, che implica il filtro due volte, e non è leggibile. Tuttavia, è concettualmente più semplice da comprendere e i metodi personalizzati possono essere facilmente scritti per semplificare la sintassi.
Ho il miglior approccio? Come posso farlo meglio?