(Rails)使用MASTER PREFS后备管理USER PREFS ...?

时间:2009-12-22 03:58:05

标签: ruby-on-rails fallback user-preferences

我正在寻找一种促进用户偏好的机制。我还想拥有一组“主”prefs,如果当前登录的用户没有特定的pref设置,则使用它们。我看到了几个与此相似的问题,但它们似乎进入理论而不是简单地提出质量解决方案。

基本上我正在寻找管理和存储方面的输入 - 模型,控制器等。最初我只考虑使用50+列的标准化表(性能等)。但是,我计划在未来添加各种未知的偏好,除了性能之外,我可以想象多个列失控。想法?

2 个答案:

答案 0 :(得分:1)

如果您不需要在数据库中按个别首选项进行操作或排序,则可能需要使用单个位掩码(整数)列。基本上,位掩码是一组表示为二进制数的开/关开关。例如,假设我们有三个偏好:

  1. 查看订阅
  2. 查看颜色
  3. 查看全名
  4. 假设用户有1和3开和2关。使用1表示开启,0表示关闭,其位掩码为:

    101

    (开启时)

    这会以5的形式存储在数据库中,因为101是二进制的5。 Bitmasks易于存储在数据库中(使用单个整数列),一旦您了解运算符(用于将用户的首选项合并到站点默认值中),就很容易操作。 Ryan Bates有一个关于在Rails中使用位掩码的精彩教程:Emmbedded Association。希望这能为您提供您正在寻找的具体示例。

答案 1 :(得分: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行加载)作为类变量存储在Model中。所有访问器都被重新定义,并成为别名方法链的一部分,以便在返回值为nil时返回默认值。我想用||而不是大小写,但如果用户将布尔首选项设置为false,则会导致问题。

编辑:N.B。我不知道在没有重新启动服务器的情况下更新rails应用程序中的默认值的好方法。