La sessione è consapevole dei modelli è una brutta cosa?

6

Sto pensando specificamente a Rails qui, ma sospetto che questa sia una domanda più ampia.

In un'applicazione web Rails sto utilizzando i dati della sessione nei modelli in modo che i modelli sappiano chi è loggato. Lo uso in un metodo che filtra alcuni dati dal database a seconda di un sistema di autorizzazioni molto semplice .

Il fatto è: usare le sessioni nei modelli in Rails richiede un po 'di soluzione. Funziona, ma ho la sensazione che sia qualcosa che non dovrei fare e sono preoccupato che ci sia un grande trambusto che mi manca.

Suppongo che la cosa giusta da fare sia quella di restituire tutti i dati e filtrare i bit non desiderati nel controller prima di passarli alla vista, ma farlo nel modello sembra evitare un bel po 'di duplicazione del codice e così si sente "più pulito".

Qualcuno può dirmi perché o non dovrebbe farlo? O che non è un problema?

    
posta kevtufc 27.11.2012 - 12:42
fonte

2 risposte

2

Non posso dire da una prospettiva "dovrebbe" o "non dovrebbe". Rompe il modello MVC in qualche modo.

Quindi dall'altra parte il tuo modello è responsabile di generare la logica di business e la query di database più efficienti possibili. Quindi consentire al controllore di ordinare i dati per autorizzazione non è il modo per risolvere questo problema (non dovrebbe mai ottenere alcun dato che l'utente reale non è autorizzato a vedere per ragioni di sicurezza). Quindi potrebbe essere anche peggio dell'accesso alla sessione nel modello.

Secondo me (e come lo implementerei se possibile) aggiungerei alcuni metodi speciali che prendono le informazioni dell'utente come parametri (come def show_orders(current_user) ) e restituiscono i risultati. In questo modo puoi mantenere la gestione della sessione nel controller (rilevante se in seguito decidi di utilizzare il modello per un'altra interfaccia web o altro) e avere comunque accesso ottimizzato.

Oppure aggiungi la gestione dei permessi di accesso al modello Utente in modo che tu possa accedervi come current_user.orders. Se si tratta di autorizzazioni molto semplici, potresti essere in grado di aggiungerlo alle dichiarazioni has_many in Rails. Altrimenti, aggiungi alcuni metodi lì.

    
risposta data 27.11.2012 - 13:03
fonte
2

Il filtraggio nel controllore vanifica parzialmente lo scopo di un database, cioè eseguire una scansione completa della tabella sul database e filtrare nel programma è un enorme killer delle prestazioni.

Detto questo, il tuo modello non dovrebbe memorizzare alcuna informazione di sessione. Perché? Perché ciò causerà condizioni di competizione quando molti utenti accedono contemporaneamente al sistema.

    
risposta data 27.11.2012 - 13:10
fonte

Leggi altre domande sui tag