(Rails) Управление ПОЛЬЗОВАТЕЛЬСКИМИ ПРЕДПОСЫЛКАМИ с запасным вариантом ОСНОВНОЙ ПОДГОТОВКИ ...? - PullRequest
0 голосов
/ 22 декабря 2009

Я ищу механизм для облегчения пользовательских настроек. Я также хочу иметь набор «основных» префов, которые используются, если в данный момент вошедший в систему пользователь не имеет определенного набора преф. Я вижу несколько похожих на это вопросов, но они, похоже, входят в теорию, а не просто предлагают качественное решение.

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

Ответы [ 2 ]

1 голос
/ 22 декабря 2009

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

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

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

101

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

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

0 голосов
/ 22 декабря 2009

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

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

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

...