有关每用户设置和预定义选项的最佳做法

时间:2014-10-13 07:47:03

标签: ruby-on-rails ruby ruby-on-rails-4

我想为用户保存设置,其中一些是预定义列表中的一个!使用https://github.com/ledermann/rails-settings ATM。

f.e的设置weight_unit将超出[:kg,:lb]。

我真的不想将这些东西硬编码到控制器或视图代码中。

这是一种常见的功能,所以我想知道:有没有人想出某种方法将业务抽象为类常量数据库干嘛?

3 个答案:

答案 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