Rails: ¿Mejores prácticas para almacenar la configuración del usuario?


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 ciertos ajustes. Por el momento es solo cuando recibir notificaciones por correo electrónico.

La forma 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 mejor almacenar la información en la propia tabla de usuarios? ¿O debería usar una mesa con "settings_name "y" settings_value " para estar completamente abiertos sobre el tipo de configuración almacenada allí (sin tener que ejecutar ninguna migración al agregar opciones)?

¿Cuál es su opinión?

Gracias

Author: Ole Spaarmann, 2009-11-05

4 answers

Usamos el útil plugin llamado HasEasy. Almacena los datos en una tabla vertical, pero le permite agregar validaciones, procesamiento pre/post almacenamiento, tipos, etc.

 5
Author: scottd,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-05 21:26:48

Si usa PostgreSQL, la mejor solución es usar https://github.com/diogob/activerecord-postgres-hstore / . Es una forma sencilla, rápida y fiable de almacenar hashes en la base de datos. Dado que no es solo 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']
 12
Author: joaomilho,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2013-08-12 07:03:53

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

 11
Author: Jonathan Julian,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2009-11-05 17:14:05

Si la configuración del usuario no está destinada a ser encontrable (a través de un Usuario.find_by_x_preference, por ejemplo) también podría almacenarlos en una columna serializada como un hash. Este es el caso de uso descrito en los documentos de rails ( 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"}
 10
Author: bantic,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2010-04-16 04:44:32