rails ruby-on-rails settings user-controls

ruby on rails - Rails: ¿Mejores prácticas para almacenar configuraciones de usuario?



rbac ruby on rails (4)

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

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 se reciben notificaciones por email.

La forma más sencilla sería crear un "Configuración" de modelo y tener una columna para cada configuración y luego tener una relación de 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 tabla con "settings_name" y "settings_value" para estar completamente abierta sobre el tipo de configuración almacenada allí (sin tener que ejecutar ninguna migración al agregar opciones)?

¿Cuál es tu opinión?

Gracias


Si no se pretende que la configuración del usuario sea accesible (a través de un User.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"}


Si usa PostgreSQL, la mejor solución es usar https://github.com/diogob/activerecord-postgres-hstore/ . Es una forma sencilla, rápida y confiable de almacenar hashes en la base de datos. Como no es solo un campo de texto serializado, también puede buscarlo 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'']


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