2009-11-05 18 views
22

Me pregunto cuál es la mejor manera de almacenar la configuración del usuario? Para una aplicación web 2.0, quiero que los usuarios puedan seleccionar ciertas configuraciones. Por el momento es solo cuando recibir notificaciones por correo electrónico.Rieles: ¿práctica recomendada para almacenar la configuración del usuario?

La manera más fácil sería simplemente crear un Modelo "Configuración" y tener una columna para cada configuración y luego tener una relación 1-1 con los usuarios.

¿Pero hay un patrón para resolver esto mejor? ¿Es tal vez mejor almacenar la información en la tabla del usuario? ¿O debería usar una tabla con "settings_name" y "settings_value" para abrir completamente el tipo de configuración almacenada allí (sin tener que ejecutar migraciones al agregar opciones)?

¿Cuál es su opinión?

Gracias

Respuesta

5

Utilizamos el plugin útil llamado HasEasy. Almacena los datos en una tabla vertical, pero le permite agregar validaciones, procesamiento de almacenamiento previo/posterior, tipos, etc.

+0

Eso suena interesante, pero el enlace que publicaste está muerto. Además, Google no ayudó. ¿Alguna pista sobre dónde encontrar el complemento? –

+1

el enlace funciona para mí – DanSingerman

+0

extraño, obtengo una "Página no existe" en http://github.com/cjbottaro/has_easy –

11

El enfoque de la mesa "abierta" hace que sea difícil de modelar con AR, ya que usted tiene que preocuparse acerca de los tipos de los datos (boolean, int, string, etc.). Siempre he agregado prefs como columnas en la tabla de usuarios, y luego los muevo a una tabla user_preferences si hay "demasiados" de ellos. Es simple, y es fácil trabajar con él.

+0

así es como estoy modelando un proyecto actual, sin embargo, me pregunto, ¿cómo está accediendo a las preferencias del usuario en todo el sitio? He estado leyendo muchas publicaciones sobre cómo es malo intentar acceder al usuario actual dentro de un modelo, que todos los datos de la sesión se deben administrar en el controlador. en mi caso, aunque tengo modelos/vistas que dependen del usuario actual. Por ejemplo, si el usuario actual está navegando por los automóviles, siempre quiero mostrar el tamaño del tanque del automóvil como "litros" o "galones" dependiendo de la configuración actual del usuario. ¿Es realmente necesario hacer esto cada vez que quiero ver @ car.tank_size (current_user)? – FireDragon

10

Si los ajustes del usuario no están destinados a ser encontrados (a través de un User.find_by_x_preference, por ejemplo) también podría almacenarlos en una columna serializada como hash. Este es el caso de uso descrito en los documentos de rieles (http://www.railsbrain.com/api/rails-2.3.2/doc/index.html?a=M002334&name=serialize#), en realidad.

class User < ActiveRecord::Base 
    serialize :preferences 
end 

u = User.new 
u.preferences = {:favorite_color => "green", :favorite_book => "Moby Dick"} 
+2

agradable y limpio, pero es un "lookup + parse" en lugar de solo "buscar". Si usa la configuración con frecuencia para la lógica de la aplicación, esto podría ralentizarlo. – brittohalloran

+0

sería genial si esto puede integrarse bien con el generador de formularios – lulalala

+3

El problema que he encontrado con esta técnica es que cuando agrega una nueva preferencia, es decir,'' ': favorite_food => pizza''' no hay una forma simple de establecer las configuraciones predeterminadas para todos los usuarios, que existirían si hubiera una columna de base de datos directa. – earnold

12

Si utiliza PostgreSQL, la mejor solución es utilizar https://github.com/diogob/activerecord-postgres-hstore/. Es una forma simple, rápida y confiable de almacenar hashes en la base de datos. Dado que no se trata solo de un campo de texto serializado, también puede buscar en él, y no necesita crear una nueva tabla, como en HasEasy.

def User 
    serialize :preferences, ActiveRecord::Coders::Hstore 
end 

user = User.create preferences: { theme: "navy" } 
user.preferences['theme'] 
+7

¡Ya no necesita una gema en los rieles4! Compruebe [este cómo hacerlo] (http://mikecoutermarsh.com/using-hstore-with-rails-4/) – fotanus

Cuestiones relacionadas