(Rails) Gestire USER PREFS con un fallback MASTER PREFS...?
-
20-09-2019 - |
Domanda
Sto cercando un meccanismo attraverso il quale facilitare le preferenze dell'utente.Voglio anche avere un set di preferenze "principali" da utilizzare se l'utente attualmente connesso non ha un set di preferenze specifico.Vedo diverse domande simili a questa, ma sembrano entrare nella teoria invece di proporre semplicemente una soluzione di qualità.
Fondamentalmente sto cercando input sulla gestione e sull'archiviazione: modelli, controller, ecc.Inizialmente stavo pensando di utilizzare semplicemente una tabella normalizzata di oltre 50 colonne (per prestazioni, ecc.).Tuttavia, ho intenzione di aggiungere varie preferenze sconosciute in futuro e, prestazioni a parte, potrei immaginare che più colonne sfuggano di mano.Pensieri?
Soluzione
Nella mia mente, il modo migliore per definire e utilizzare le impostazioni predefinite è di aggiungere un'altra riga nella tabella preferenze degli utenti, e caricarlo come una variabile di classe nel modello. Poi ignorare le funzioni di accesso per trovare i valori di default se non è stata trovata la preferenza. Qualcosa di simile a questo:
class UserPreference < ActiveRecord::Base
# load default preferences as a class variable
@@defaults ||= find(1).attributes
# redefine accessors or each column to load default if nil
column_names.each do |column|
method_name = "#{column}_with_default".to_sym
send :define_method, method_name do
value = send("#{column_without_default}")
case value
when nil
@@defaults[column]
else
value
end
end
alias_method_chain column, :default
end
...
end
Essenzialmente le preferenze predefinite (caricati da fila 1) vengono memorizzati nel modello come una variabile di classe. Tutte le funzioni di accesso vengono ridefiniti e resi parte di una catena metodo di alias in modo che il default sarebbe tornato se il valore restituito era pari a zero. Volevo usare || invece di caso, ma che potrebbero causare problemi nel caso in cui l'utente aveva impostato una preferenza booleano false.
Modifica: N.B. Non so di un buon modo per aggiornare le impostazioni predefinite in un app rotaie senza riavviare il server.
Altri suggerimenti
Se non è necessario manipolare o ordinare in base alle preferenze individuali nel database, è possibile utilizzare una singola colonna con maschera di bit (intero).Fondamentalmente, una maschera di bit è un insieme di interruttori on/off rappresentati come un numero binario.Ad esempio, supponiamo di avere tre preferenze:
- visualizzare gli abbonamenti
- visualizzare i colori
- visualizzare i nomi completi
Supponiamo che un utente abbia 1 e 3 attivi e 2 disattivati.Usando 1 per on e 0 per off, la maschera di bit per questo è:
101
(acceso spento acceso)
Questo viene archiviato nel database come 5
Perché 101
è 5 in binario.Le maschere di bit sono facili da memorizzare nel database (utilizzano una singola colonna intera) e sono facili da manipolare una volta conosciuti gli operatori (per unire le preferenze di un utente nelle impostazioni predefinite del sito).Ryan Bates ha un ottimo tutorial sull'uso delle maschere di bit in Rails: Associazione incorporata.Spero che questo ti dia l'esempio concreto che stai cercando.