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?

Était-ce utile?

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:

  1. abonnements vue
  2. les couleurs de vue
  3. 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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top