Ответ 1
Обычно это хорошая идея в пользу нормализации. Второе решение упрощает ваши модели, позволяет легко расширяемость при добавлении новых настроек и сохраняет ваши таблицы незагроможденными.
Я видел два разных подхода к сохранению пользовательских настроек.
ПОДХОД 1: Сериализация их и сохранение в одном столбце таблицы USERS
ПОДХОД 2: Создание отдельной таблицы PREFERENCES и создание ассоциации has_many от USERS до PREFERENCES.
Какой из этих двух подходов вы бы предпочли, и каковы плюсы и минусы каждого из них?
Обычно это хорошая идея в пользу нормализации. Второе решение упрощает ваши модели, позволяет легко расширяемость при добавлении новых настроек и сохраняет ваши таблицы незагроможденными.
Я справился с этим же вопросом, поэтому я решил поделиться тем, что нашел в ответе "community wiki".
Простые пользовательские настройки для вашего приложения Rails - это сообщение в блоге, описывающее, как это сделать.
Изменить сериализованный хеш в форме? описывает, как отредактировать такой хеш в форме.
Полезный трюк заключается в том, чтобы сделать форму из хеша OpenStruct.new(@user.preferences)
автоматически создавать методы доступа для каждого хэш-атрибута.
DYE/has_serialized - GitHub позволяет обрабатывать эти атрибуты в сериализованном хеше как атрибуты в (пользовательской) модели.
Лучшая практика хранения пользовательских настроек? содержит несколько советов. Ниже приведены некоторые библиотеки, в том числе два из другого ответа от @hopeless.
Вы также можете попробовать использовать метапрограммирование: Практическое метапрограммирование с помощью Ruby: сохранение настроек
Улучшенная версия первого подхода может быть выполнена, если вы используете PostgreSQL 9.2/3 + и Rails 4+. Вы можете использовать store_accessor
для хранения предпочтений в столбце hstore PostgreSQL с поддержкой проверок и запросов.
class User
store_accessor :preferences, :receive_newsletter
validates :receive_newsletter, presence: true
end
user.receive_newsletter => 'true'
User.where("preferences->'receive_newsletter' = 'true'")
Подробнее см. http://mikecoutermarsh.com/using-hstore-with-rails-4/ для дополнительной информации (миграции) и специальной заметки по обработке логических данных.
Подход 2
Вы можете добавлять настройки, не загромождая таблицу пользователя
Есть несколько плагинов Rails для обработки этой утилиты:
Я бы использовал 2, потому что он чище и проще обновлять. Вы сможете добавлять дополнительные настройки как можно более сложные.
Это будет немного медленнее, так как у вас есть соединение, но это будет стоить
В 2016 году я вернусь Вариант 2.
Пользовательские настройки обычно становятся основной частью каждого приложения. Если они извлекаются по каждому запросу, вы делаете дополнительный запрос с каждым запросом. Использование отдельной таблицы имеет смысл, если для каждой настройки необходимо иметь отдельные столбцы. Но поскольку они использовали jsonb, это не проблема. Его просто один столбец.