我想为用户保存设置,其中一些是预定义列表中的一个!使用https://github.com/ledermann/rails-settings ATM。
f.e的设置weight_unit将超出[:kg,:lb]。
我真的不想将这些东西硬编码到控制器或视图代码中。
这是一种常见的功能,所以我想知道:有没有人想出某种方法将业务抽象为类常量或数据库干嘛?
答案 0 :(得分:1)
通常,当我必须存储一些我不关心单独查询的重要信息时,我将它们存储在序列化列中。
在您的情况下,您可以在users表中创建一个新列(例如将其命名为“settings”)。
之后,您将添加到用户模型
serialize :settings, Hash
从这一刻起,您可以将任何您喜欢的内容放入设置中,例如
user.settings = {:weight_unit => :kg, :other_setting1 => 'foo', :other_setting2 => 'bar'}
并使用user.save保存,您将在设置列中获得序列化数据。
Rails也会对其进行反序列化,因此在获取用户记录后,调用user.settings,您将获得该用户的所有已保存设置。
要获取有关序列化()的更多信息,请参阅文档:http://api.rubyonrails.org/classes/ActiveRecord/AttributeMethods/Serialization/ClassMethods.html#method-i-serialize
<强> UPDATE1 强> 要确保设置在预定义列表中,您可以在用户模型上使用验证。
<强> UPDATE2 强> 通常,如果存在一些预定义的值,那么将它们存储在相关模型内的常量中是一个好习惯,这样您就可以从模型(内部和外部)访问它们。可接受的值不会因实例而改变,因此在所有值之间共享它们是有意义的。一个比任何单词更有价值的例子。在用户模型中定义:
ALLOWED_SETTINGS = {:weight_unit => [:kg, :lb],
:eyes_color => [:green, :blue, :brows, :black],
:hair_length => [:short, :long]}
你可以同时使用
在模型本身之外,正在进行
用户:: ALLOWED_SETTINGS
在模型中(在验证,实例方法或任何您需要的地方):
ALLOWED_SETTINGS
答案 1 :(得分:1)
根据您的问题,听起来这些是特定用户可以选择的更多配置选项,这些选项可能是非常静态的,而不是动态的,因为选项可能会随时间而变化。例如,我怀疑您是否会添加除weight_units
和:kg
之外的其他:lb
,但我可能会误解您的问题。< / p>
如果我正确读取此内容,我会建议(并已使用)config/
目录中的yml文件以获取此类值。 yml文件可以在应用程序范围内访问,并且您可以使用所有&#34;设置&#34;可以住在一个文件中。然后可以将这些作为常量加载到模型中,并按@SDp建议序列化。但是,我倾向于谨慎行事,尤其是在考虑这些共同的价值观时。有些人可能希望在某天查询,所以我更愿意将每个这些作为一个列而不是单个序列化值。开销不是那么多,你可以从Rails中获得许多额外的内置好处,让它们成为单独的列。
那就是说,我亲自使用hstore和Postgres取得了巨大的成功,正如你所描述的那样。但是,我选择在单个列上使用hstore的原因是因为我存储了多个不同的人口统计数据,其中所有人口统计数据都可能随时间而变化(例如,可以添加一些键,更重要的是,可以删除一些键。 )听起来就像你的情况一样,你不太可能删除密钥,因为这些是基本特征,但同样,我可能是错的。
TL; DR - 我觉得除非你有令人信服的理由(例如定期添加和/或删除键/设置),否则它们应该是数据库表上的单独列。如果您强烈认为这些应存储在序列化的数据库中,并且您正在使用Postgres,请查看hstore。
答案 2 :(得分:0)
如果你正在使用PostgreSQL,我想你可以通过Rails 4 +这个gem https://github.com/devmynd/hstore_accessor来观看HStore