Ответ 1
Мы используем полезный плагин под названием HasEasy. Он хранит данные в вертикальной таблице, но позволяет добавлять проверки, обработку до/после хранения, типы и т.д.
Мне интересно, как лучше всего хранить пользовательские настройки? Для приложения Web 2.0 я хочу, чтобы пользователи могли выбирать определенные настройки. На данный момент это только когда получать уведомления по электронной почте.
Самый простой способ - просто создать модель "Настройки" и иметь столбец для каждого параметра, а затем иметь отношения 1-1 с пользователями.
Но есть ли образец, чтобы решить это лучше? Может быть, лучше хранить информацию в самой таблице пользователя? Или я должен использовать таблицу с параметрами "settings_name" и "settings_value", чтобы полностью открыть тип хранимых там настроек (без необходимости выполнять какие-либо миграции при добавлении опций)?
Каково ваше мнение?
Спасибо
Мы используем полезный плагин под названием HasEasy. Он хранит данные в вертикальной таблице, но позволяет добавлять проверки, обработку до/после хранения, типы и т.д.
Если вы используете 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']
Подход "открытых" таблиц затрудняет моделирование с помощью AR, поскольку вам приходится беспокоиться о типах данных (boolean, int, string и т.д.). Я всегда добавлял prefs в виде столбцов в таблице users, а затем перемещал их в таблицу user_preferences, если их "слишком много". Это просто, и с ним легко работать.
Если пользовательские настройки не предназначены для поиска (например, через 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"}