我正在寻找一种促进用户偏好的机制。我还想拥有一组“主”prefs,如果当前登录的用户没有特定的pref设置,则使用它们。我看到了几个与此相似的问题,但它们似乎进入理论而不是简单地提出质量解决方案。
基本上我正在寻找管理和存储方面的输入 - 模型,控制器等。最初我只考虑使用50+列的标准化表(性能等)。但是,我计划在未来添加各种未知的偏好,除了性能之外,我可以想象多个列失控。想法?
答案 0 :(得分:1)
如果您不需要在数据库中按个别首选项进行操作或排序,则可能需要使用单个位掩码(整数)列。基本上,位掩码是一组表示为二进制数的开/关开关。例如,假设我们有三个偏好:
假设用户有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应用程序中的默认值的好方法。