(Rails) Управление ПОЛЬЗОВАТЕЛЬСКИМИ предпочтениями с помощью резервной копии MASTER PREFS ...?
-
20-09-2019 - |
Вопрос
Я ищу механизм, с помощью которого можно было бы упростить пользовательские настройки.Я также хочу иметь набор "основных" префиксов, которые используются, если у текущего вошедшего в систему пользователя нет определенного набора префиксов.Я вижу несколько вопросов, похожих на этот, но они, похоже, уходят в теорию вместо того, чтобы просто предлагать качественное решение.
В основном я ищу информацию как по управлению, так и по хранилищу - модели, контроллеры и т.д.Первоначально я рассматривал возможность просто использовать нормализованную таблицу из более чем 50 столбцов (для повышения производительности и т.д.).Тем не менее, я планирую добавить различные неизвестные настройки в будущем, и, помимо производительности, я мог бы представить, что несколько столбцов выйдут из-под контроля.Мысли?
Решение
На мой взгляд, лучший способ определить и использовать значения по умолчанию - это добавить еще одну строку в таблицу пользовательских настроек и загрузить ее как переменную класса в вашей модели.Затем переопределите средства доступа, чтобы найти значения по умолчанию, если предпочтение не было найдено.Что - то вроде этого:
class UserPreference < ActiveRecord::Base
# load default preferences as a class variable
@@defaults ||= find(1).attributes
# redefine accessors or each column to load default if nil
column_names.each do |column|
method_name = "#{column}_with_default".to_sym
send :define_method, method_name do
value = send("#{column_without_default}")
case value
when nil
@@defaults[column]
else
value
end
end
alias_method_chain column, :default
end
...
end
По сути, настройки по умолчанию (загруженные из строки 1) хранятся в Модели как переменная класса.Все средства доступа переопределяются и становятся частью цепочки методов псевдонимов, так что значение по умолчанию будет возвращено, если возвращаемое значение равно нулю.Я хотел использовать || вместо case, но это вызвало бы проблемы в том случае, если пользователь установил логическое значение false .
Редактировать:Н.Б.Я не знаю хорошего способа обновить значения по умолчанию в приложении rails без перезапуска сервера.
Другие советы
Если вам не нужно манипулировать или сортировать данные по индивидуальным предпочтениям в базе данных, вы можете использовать столбец с одной битовой маской (целочисленный).По сути, битовая маска представляет собой набор переключателей включения/выключения, представленный в виде двоичного числа.Например, предположим, что у нас есть три предпочтения:
- просматривать подписки
- просмотреть цвета
- посмотреть полные имена
Допустим, у пользователя включены 1 и 3, а 2 выключены.Используя 1 для включения и 0 для выключения, битовая маска для этого будет следующей:
101
(вкл выкл вкл)
Это сохраняется в базе данных как 5
потому что 101
равно 5 в двоичном формате.Битовые маски легко хранить в базе данных (используйте один целочисленный столбец) и ими легко манипулировать, если вы знаете операторы (для объединения предпочтений пользователя со значениями сайта по умолчанию).У Райана Бейтса есть отличное руководство по использованию битовых масок в Rails: Встроенная ассоциация.Надеюсь, это даст вам конкретный пример, который вы ищете.