Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails (Rails)使用主PREFS回退功能管理用户PREFS。。。?_Ruby On Rails_Fallback_User Preferences - Fatal编程技术网

Ruby on rails (Rails)使用主PREFS回退功能管理用户PREFS。。。?

Ruby on rails (Rails)使用主PREFS回退功能管理用户PREFS。。。?,ruby-on-rails,fallback,user-preferences,Ruby On Rails,Fallback,User Preferences,我正在寻找一种促进用户偏好的机制。我还希望有一组“主”pref,如果当前登录的用户没有特定的pref集,可以使用这些pref。我看到一些类似的问题,但它们似乎进入了理论,而不是简单地提出一个高质量的解决方案 基本上,我在寻找管理和存储方面的输入——模型、控制器等。最初我只是考虑使用一个50多列的标准化表(用于性能等)。然而,我计划在将来添加各种未知的首选项,除了性能之外,我可以想象多个列会失控。想法?如果不需要在数据库中按个人首选项进行操作或排序,则可能需要使用单个位掩码(整数)列。基本上,位掩

我正在寻找一种促进用户偏好的机制。我还希望有一组“主”pref,如果当前登录的用户没有特定的pref集,可以使用这些pref。我看到一些类似的问题,但它们似乎进入了理论,而不是简单地提出一个高质量的解决方案


基本上,我在寻找管理和存储方面的输入——模型、控制器等。最初我只是考虑使用一个50多列的标准化表(用于性能等)。然而,我计划在将来添加各种未知的首选项,除了性能之外,我可以想象多个列会失控。想法?

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

  • 查看订阅
  • 查看颜色
  • 查看全名
  • 假设一个用户有1和3开和2关。使用1s表示开,0s表示关,其位掩码为:

    101

    (开-关-开)


    这将作为
    5
    存储在数据库中,因为
    101
    是二进制的5。位掩码很容易存储在数据库中(使用一个整数列),并且一旦知道了运算符(用于将用户的首选项合并到站点默认值中),就很容易操作。Ryan Bates有一个关于在Rails中使用位掩码的优秀教程:。希望这将为您提供一个具体的示例。

    在我看来,定义和使用默认值的最佳方法是在用户首选项表中添加另一行,并将其作为类变量加载到模型中。然后,如果未找到首选项,则重写访问器以查找默认值。大概是这样的:

    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
    
    class-UserPreference
    基本上,默认首选项(从第1行加载)作为类变量存储在模型中。所有访问器都被重新定义并成为别名方法链的一部分,因此,如果返回值为nil,则将返回默认值。我想用| |代替case,但如果用户将布尔首选项设置为false,则会导致问题


    编辑:注意,我不知道有什么好方法可以在不重新启动服务器的情况下更新rails应用程序中的默认值。

    我非常喜欢使用位掩码。不幸的是,我的许多pref不是布尔值。还有颜色选择器、日期选项、数量等。还有其他想法吗?谢谢。对于非布尔值,您可以通过创建名为“首选项”的“文本”DB列并将“序列化:首选项”添加到您的模型中来使用序列化哈希。