Pregunta

Busco un mecanismo por el cual para facilitar las preferencias del usuario. También quiero tener un conjunto de Preferencias "maestros" que se utilizan si el usuario actualmente conectado no tiene un conjunto específico de pref. Veo varias preguntas similares a esta, pero parece que entrar en la teoría en lugar de simplemente proponer una solución de calidad.

Básicamente estoy buscando para la entrada en la gestión, así como de almacenamiento - los modelos, controladores, etc. Inicialmente estaba considerando simplemente ir con una tabla normalizada de más de 50 columnas (para el rendimiento, etc.). Sin embargo, planeo añadiendo varias preferencias, desconocidos en el futuro y, el rendimiento a un lado, me podría imaginar varias columnas yendo de las manos. Pensamientos?

¿Fue útil?

Solución

En mi opinión, la mejor manera de definir y utilizar valores por defecto es añadir otra fila en la tabla de las preferencias del usuario y cargarlo como una variable de clase en su modelo. Entonces anular los descriptores de acceso para encontrar los valores por defecto si no se ha encontrado la preferencia. Algo como esto:

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

Esencialmente las preferencias por defecto (cargados desde la fila 1) se almacenan en el modelo como una variable de clase. Todos los descriptores de acceso se redefinen y forman parte de una cadena método alias de modo que el defecto sería devuelto si el valor devuelto fue nula. Quería utilizar || en lugar de caso, pero que podría causar problemas en el caso de que el usuario había establecido una preferencia boolean false.

Editar: N. B. No sé de una buena manera de actualizar los valores por defecto en una aplicación de rieles sin necesidad de reiniciar el servidor.

Otros consejos

Si no es necesario manipular o ordenar por preferencias individuales en la base de datos, entonces es posible que desee utilizar una sola columna de máscara de bits (entero). Básicamente, una máscara de bits es un conjunto de interruptores de encendido / apagado representan como un número binario. Por ejemplo, digamos que tenemos tres preferencias:

  1. vista suscripciones
  2. Ver colores
  3. ver nombres completos

Supongamos que un usuario tiene 1 y 3 en y 2 fuera. El uso de 1s y 0s para el de fuera, la máscara de bits de esto es:

101

(ON OFF ON)

Esto se almacena en la base de datos como 5 porque es 101 5 en binario. Máscaras de bits son fáciles de almacenar en la base de datos (usar una sola columna de número entero) y son fáciles de manipular una vez que conozca los operadores (para la fusión de las preferencias del usuario en los valores por defecto del sitio). Ryan Bates tiene un gran tutorial sobre el uso de máscaras de bits en Rails: Asociación Emmbedded . Es de esperar que le dará el ejemplo concreto que usted está buscando.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top