(Rails) 使用主偏好设置回退管理用户偏好设置……?
-
20-09-2019 - |
题
我正在寻找一种促进用户偏好的机制。我还希望拥有一组“主”首选项,如果当前登录的用户没有设置特定的首选项,则可以使用这些首选项。我看到了几个与此类似的问题,但它们似乎进入了理论,而不是简单地提出了一个高质量的解决方案。
基本上,我正在寻找有关管理和存储的输入——模型、控制器等。最初我只是考虑简单地使用一个包含 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 和 3,关闭了 2。使用 1 表示打开,0 表示关闭,其位掩码为:
101
(开 关 开)
这将存储在数据库中 5
因为 101
二进制为 5。位掩码很容易存储在数据库中(使用单个整数列),并且一旦您知道运算符(用于将用户的首选项合并到站点默认值中),就很容易操作。Ryan Bates 有一个关于在 Rails 中使用位掩码的精彩教程: 嵌入式关联. 。希望这能为您提供您正在寻找的具体示例。