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

基本上,我正在寻找有关管理和存储的输入——模型、控制器等。最初我只是考虑简单地使用一个包含 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行加载)被存储在模型中作为一个类变量。所有的访问者被重新定义,并提出一个别名方法链的一部分,这样,如果返回值是零缺省将返回。我想用||代替的情况下,但是这将导致在用户已设定布尔值的偏好为假的情况下的问题。

编辑:N.B.我不知道更新一个Rails应用程序的默认值,无需重新启动服务器的好方法。

其他提示

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

  1. 查看订阅
  2. 查看颜色
  3. 查看全名

假设用户打开了 1 和 3,关闭了 2。使用 1 表示打开,0 表示关闭,其位掩码为:

101

(开 关 开)

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

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top