保存用户偏好的最佳方法是什么?

48

我曾看到过两种不同的保存用户偏好设置的方法。

方法1: 将它们序列化并保存在USERS表的一列中。

方法2: 创建一个单独的PREFERENCES表,并从USERS到PREFERENCES建立has_many关联。

你更喜欢上述两种方法中的哪一种,它们各自相对于另一种的优缺点是什么?


@hopeless - 这应该是多个项目。 我倾向于选项2,但通过查看Rails序列化选项,我觉得使用哈希作为选项1可以更或多或少地实现相似的效果,从而不需要另一个表格和更多SQL join。 如果有任何反馈,请告诉我们。 另外,你们所说的在用户表中堆积是什么意思,所有偏好都将仅存储在偏好列中。 - Dharam Gollapudi
@satynos - 混乱意味着用户表现在比只保存登录/名称信息更加混乱。如果您正在序列化,则在需要查找内容时需要进行更多的工作。基本上,每次需要知道一个偏好设置时,您都必须解析所有偏好设置。将偏好设置(如果只有几个)作为用户表上的字段比偏好设置更好,因为您不必查看所有偏好设置才能找到其中一个。 - Joel Meador
3
基本上,每次需要知道一个首选项时,您都必须解析所有的首选项。解析YAML非常快速。至于FWIW,这里没有人给出任何真正的理由,这只是纯粹的信仰。 - Tom Lehman
@HoraceLoeb 我同意:如果它们被存储为属性,那么每次从数据库加载对象时都会解析每个属性。同样的问题。 - Dogweather
针对Rails 4 - http://api.rubyonrails.org/classes/ActiveRecord/Store.html - ajahongir
显示剩余2条评论
7个回答

22

通常最好优先选择规范化。第二种解决方案使你的模型更加清晰,如果新增偏好时易于扩展,并使表格保持简洁。


21

我曾经也遇到了同样的问题,所以我想分享一下我在“社区维基”答案中找到的内容。

将序列化放在单个属性中

为你的Rails应用程序提供简单的用户偏好设置是一篇博客文章,介绍了如何实现此功能。

在表单中编辑序列化的哈希?描述了如何在表单中编辑这样的哈希。一个有用的技巧是使用OpenStruct.new(@user.preferences)哈希来创建表单,自动为每个哈希属性生成访问器方法。

DYE/has_serialized - GitHub使您可以将序列化哈希中的这些属性视为模型(用户)上的属性。

偏好设置位于单独的表中

存储用户设置的最佳实践?有一些提示。以下是包括@hopeless另一个答案中的两个库。

  • rails-settings管理一个键值对表,就像在数据库中存储的哈希一样,使用类似于简单的ActiveRecord方法来操作。您可以存储任何类型的对象:字符串、数字、数组或任何可以表示为YAML的对象。(已测试过Rails 3.1及更新版本,包括Rails 4.x和Rails 5.x)
  • Preference-fu适用于简单的布尔偏好设置,使用单个列来存储多个偏好设置。(上次更新时间为2009年)
  • Preferences更加灵活,使用单独的表,具有一些不错的语法糖。(上次更新时间为2011年)
  • HasEasy 将数据存储在一个纵向表格中,但允许您添加验证、存储前/后处理、类型等功能。(最后更新于2008年)

你也可以尝试使用元编程:Ruby 元编程实践:存储偏好设置


5

如果你正在使用PostgreSQL 9.2/3+和Rails 4+,那么可以采用改进版的第一种方法。你可以使用store_accessor将偏好设置存储在支持验证和查询的PostgreSQL hstore列中。

class User
  store_accessor :preferences, :receive_newsletter

  validates :receive_newsletter, presence: true
end

user.receive_newsletter => 'true'

User.where("preferences->'receive_newsletter' = 'true'")

请参考http://mikecoutermarsh.com/using-hstore-with-rails-4/了解更多细节(迁移)以及处理布尔值的特殊注意事项。


3

方法二

您可以添加偏好设置,而不会使用户表过于混乱


3

有一些可以处理这个用例的Rails插件:

  • Preference-fu(适用于简单的布尔偏好设置,将多个偏好设置存储在单个列中)
  • Preferences(更灵活,使用单独的表格,具有一些漂亮的语法糖)

"preferences"似乎已经被弃用。它无法在Rails 4中使用。 - elquimista

1

我会选择方法2,因为它更加简洁易懂且方便更新。你可以添加任意复杂的偏好设置。

虽然速度会稍微慢一些,但是这个选择将是值得的。


0

在2016年,我会支持选项2

为什么?

用户设置往往成为每个应用程序的核心部分。如果它们在每个请求中被检索,那么现在每个请求都需要进行额外的查询。当您必须为每个设置拥有单独的列时,使用单独的表是有意义的。但由于我们使用jsonb,这不是问题。它只是一个单独的列。

阅读更多


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接