2009-12-22 3 views
0

Я ищу механизм для облегчения пользовательских настроек. Я также хочу иметь набор «главных» префов, которые используются, если у текущего пользователя, не входящего в систему, нет определенного набора pref. Я вижу несколько вопросов, подобных этому, но они, похоже, входят в теорию, а не просто предлагают качественное решение.(Rails) Управление USER PREFS с помощью резервной копии MASTER PREFS ...?

В основном я ищу информацию об управлении, а также о хранилищах - моделях, контроллерах и т. Д. Первоначально я рассматривал просто переход с нормализованной таблицей из 50 + столбцов (для производительности и т. Д.). Тем не менее, я планирую добавить различные, неизвестные предпочтения в будущем и, в стороне от исполнения, я мог бы представить, что несколько столбцов выходят из-под контроля. Мысли?

ответ

0

На мой взгляд, лучший способ определить и использовать значения по умолчанию - добавить еще одну строку в таблицу настроек пользователя и загрузить ее в качестве переменной класса в вашей модели. Затем переопределите получателей, чтобы найти значения по умолчанию, если предпочтение не было найдено. Что-то вроде этого:

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) сохраняются в Модели как переменная класса. Все аксессоры переопределены и включены в цепочку методов псевдонима, чтобы вернуть значение по умолчанию, если возвращаемое значение было равно нулю. Я хотел использовать || вместо случая, но это вызовет проблемы в случае, если пользователь установил логическое предпочтение false.

Редактировать: N.B. Я не знаю, как можно улучшить настройки по умолчанию в приложении rails без перезапуска сервера.

1

Если вам не нужно манипулировать или сортировать по индивидуальным предпочтениям в базе данных, вам может понадобиться использовать один битмакс (целочисленный) столбец. В принципе, битмаска представляет собой набор переключателей включения/выключения, представленных как двоичное число. Например, предположим, что у нас есть три предпочтения:

  1. вид подписки
  2. вид цветов
  3. просмотреть полные имена

Давайте предположим, что пользователь имеет 1 и 3, и 2 шт. Использование 1s для включения и 0s для выключения, битовая маска для этого:

(вкл выкл вкл)

Это сохраняется в базе данных как 5 потому 101 в двоичном 5. Битмаксы легко хранить в базе данных (использовать один целочисленный столбец) и легко манипулировать, как только вы знаете операторов (для слияния предпочтений пользователя с настройками сайта). У Райана Бейтса есть отличный учебник по использованию битмасков в Rails: Emmbedded Association. Надеюсь, это даст вам конкретный пример, который вы ищете.

+0

Я большой поклонник использования битмасков. К сожалению, многие из моих префов не являются логическими. Есть цветовые селектора, параметры даты, количества и т. Д. Любые другие мысли? Спасибо, кстати. –

+0

Для небулевых значений вы можете использовать сериализованный хеш, создав столбец «text» DB с названием «предпочтения» и добавив «сериализуйте: предпочтения» к своей модели. –