(Rails) Gestion prefs utilisateur avec un MASTER PREFS ... repli?
-
20-09-2019 - |
Question
Je suis à la recherche d'un mécanisme permettant de faciliter les préférences de l'utilisateur. Je veux aussi avoir un ensemble de prefs « maître » qui sont utilisés si l'utilisateur actuellement connecté ne dispose pas d'un ensemble pref spécifique. Je vois plusieurs questions semblables à cela, mais ils semblent entrer dans la théorie au lieu de proposer simplement une solution de qualité.
En fait, je suis à la recherche d'entrée sur la gestion ainsi que le stockage - modèles, contrôleurs, etc. Au début, je considérais tout simplement aller avec une table normalisée de 50+ colonnes (pour etc. performance). Cependant, je prévois ajouter diverses, préférences inconnues à l'avenir et, la performance de côté, je pouvais imaginer plusieurs colonnes sortir de la main. Pensées?
La solution
Dans mon esprit, la meilleure façon de définir et d'utiliser par défaut est d'ajouter une ligne dans le tableau des préférences de l'utilisateur et le charger comme une variable de classe dans votre modèle. Ensuite, passer outre les accesseurs pour trouver les valeurs par défaut si la préférence n'a pas été trouvé. Quelque chose comme ceci:
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
Essentiellement, les préférences par défaut (chargés à partir de la rangée 1) sont stockés dans le modèle comme une variable de classe. Tous les accesseurs sont redéfinis et fait partie d'une chaîne de méthode d'alias de telle sorte que la valeur par défaut serait renvoyée si la valeur retournée était nulle. Je voulais utiliser || au lieu de cas, mais cela poserait des problèmes dans le cas où l'utilisateur a défini une préférence booléenne false.
Edit: N.B. Je ne sais pas d'une bonne façon de mettre à jour les paramètres par défaut dans une application de rails sans redémarrer le serveur.
Autres conseils
Si vous n'avez pas besoin de manipuler ou de trier par les préférences individuelles dans la base de données, vous pouvez utiliser une seule colonne bitmask (entier). Fondamentalement, un masque de bits est un ensemble d'interrupteurs marche / arrêt représentée par un nombre binaire. Par exemple, disons que nous avons trois préférences:
- abonnements vue
- les couleurs de vue
- voir le nom complet
Disons que un utilisateur 1 et 3 et 2 off. L'utilisation 1s pour le et pour 0s au large, le bitmask en est:
101
(on off on)
est stocké dans la base de données 5
parce 101
est 5 en binaire. Bitmasks sont faciles à stocker dans la base de données (utiliser une seule colonne entière) et sont faciles à manipuler une fois que vous connaissez les opérateurs (pour fusionner les préférences d'un utilisateur dans les paramètres par défaut du site). Ryan Bates a un grand tutoriel sur l'utilisation bitmasks dans Rails: Emmbedded Association . Espérons que cela vous donnera l'exemple concret que vous cherchez.