Подтвердить что ты не робот

Rails: Лучшая практика для хранения пользовательских настроек?

Мне интересно, как лучше всего хранить пользовательские настройки? Для приложения Web 2.0 я хочу, чтобы пользователи могли выбирать определенные настройки. На данный момент это только когда получать уведомления по электронной почте.

Самый простой способ - просто создать модель "Настройки" и иметь столбец для каждого параметра, а затем иметь отношения 1-1 с пользователями.

Но есть ли образец, чтобы решить это лучше? Может быть, лучше хранить информацию в самой таблице пользователя? Или я должен использовать таблицу с параметрами "settings_name" и "settings_value", чтобы полностью открыть тип хранимых там настроек (без необходимости выполнять какие-либо миграции при добавлении опций)?

Каково ваше мнение?

Спасибо

4b9b3361

Ответ 1

Мы используем полезный плагин под названием HasEasy. Он хранит данные в вертикальной таблице, но позволяет добавлять проверки, обработку до/после хранения, типы и т.д.

Ответ 2

Если вы используете PostgreSQL, лучшим решением будет использование https://github.com/diogob/activerecord-postgres-hstore/. Это простой, быстрый и надежный способ хранения хэшей в базе данных. Так как это не просто сериализованное текстовое поле, вы можете искать на нем также, и вам не нужно создавать новую таблицу, как в HasEasy.

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

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

Ответ 3

Подход "открытых" таблиц затрудняет моделирование с помощью AR, поскольку вам приходится беспокоиться о типах данных (boolean, int, string и т.д.). Я всегда добавлял prefs в виде столбцов в таблице users, а затем перемещал их в таблицу user_preferences, если их "слишком много". Это просто, и с ним легко работать.

Ответ 4

Если пользовательские настройки не предназначены для поиска (например, через User.find_by_x_preference), вы также можете сохранить их в сериализованном столбце как хэш. Это вариант использования, описанный в документах rails (http://www.railsbrain.com/api/rails-2.3.2/doc/index.html?a=M002334&name=serialize#).

class User < ActiveRecord::Base
  serialize :preferences
end

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