最好的方法来保存用户的喜好?

我已经看到两种不同的方法来保存用户的喜好。

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

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

上述两种方法中哪一种更适合您,哪一种更胜一筹?

偏好正常化通常是一个好主意。 第二种解决scheme可以让您的模型更加清洁,如果添加新的首选项,则可以轻松扩展,并且可以保持表格的整洁。

我解决了同样的问题,所以我想我会分享我在“社区wiki”中find的答案。

序列化在一个单一的属性

您的Rails应用程序的简单用户首选项是一篇博客文章,描述如何执行此操作。

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

DYE / has_serialized – GitHub可以让你把序列化哈希中的属性当作(用户)模型的属性。

在单独的表中的首选项

存储用户设置的最佳做法? 有一些提示。 下面是一些库,包括@hopeless的另一个答案。

  • rails-settings使用简单的ActiveRecord类似的方法来pipe理一个存储在你的数据库中的键/值对的表。 您可以存储任何types的对象:string,数字,数组或任何可以记为YAML的对象。 (使用Rails 3.1进行testing)
  • Preference-fu适用于简单的布尔首选项,对于多个首选项使用单个列(2009年最后更新)
  • 首选项更灵活,使用单独的表格,一些很好的语法糖。 (最后更新2011年)
  • HasEasy将数据存储在垂直表中,但允许您添加validation,存储处理前/后处理,types等(最后更新2008年)

您也可以尝试使用元编程: 使用Ruby的实用元编程:存储首选项

如果您使用PostgreSQL 9.2 / 3 +和Rails 4+,则可以使用第一种方法的改进版本。 您可以使用store_accessor将首选项存储在PostgreSQL hstore列中,支持validation和查询。

 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/了解更多细节(迁移)以及关于处理布尔值的特别注意事项。;

方法2

您可以添加首选项,而不会混淆用户表

有一些Rails插件来处理这个用例:

  • Preference-fu (适用于简单的布尔首选项,对多个首选项使用单个列)
  • 首选项 (更灵活,使用单独的表,一些很好的语法糖)

我会接近2,因为它更清洁,更容易更新。 您可以根据需要添加更多的偏好设置。

由于你有一个连接,它会慢一点,但这是值得的

在2016年,我会支持选项2

为什么?

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

阅读更多