48

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

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

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

您更喜欢上述两种方法中的哪一种,彼此之间的优缺点是什么?

4

7 回答 7

22

支持标准化通常是个好主意。第二种解决方案使您的模型更干净,如果添加了新的首选项,则可以轻松扩展,并使您的表格保持整洁。

于 2009-07-03T14:56:58.847 回答
21

我努力解决了同样的问题,所以我想我会分享我在“社区维基”答案中找到的内容。

在单个属性中序列化

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

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

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

单独表格中的首选项

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

  • rails-settings使用简单的 ActiveRecord 之类的操作方法来管理存储在数据库中的键/值对表,例如存储在数据库中的 Hash。您可以存储任何类型的对象:字符串、数字、数组或任何可以记为 YAML 的对象。(使用 Rails 3.1 和更新版本进行测试,包括 Rails 4.x 和 Rails 5.x)
  • Preference-fu适用于简单的布尔首选项,对多个首选项使用单列。(最后更新于 2009 年)
  • 首选项更灵活,使用单独的表,一些不错的语法糖。(最后更新于 2011 年)
  • HasEasy将数据存储在垂直表中,但允许您添加验证、存储前/后处理、类型等(最后更新于 2008 年)

您也可以尝试使用元编程: Practical Metaprogramming with Ruby:Storing Preferences

于 2011-09-10T17:24:25.623 回答
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/ 。

于 2014-07-29T19:41:46.257 回答
3

方法二

您可以添加首选项,而不会弄乱用户表

于 2009-07-03T14:55:26.960 回答
3

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

  • Preference-fu(适用于简单的布尔首选项,对多个首选项使用单列)
  • 首选项 (更灵活,使用单独的表格,一些不错的语法糖)
于 2009-07-03T15:18:10.293 回答
1

我会接近 2,因为它更干净,更容易更新。您将能够根据需要添加更多复杂的首选项。

因为你要加入,所以会慢一点,但这是值得的

于 2009-07-03T17:02:52.420 回答
0

2016 年,我会支持Option 2

为什么?

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

阅读更多

于 2016-12-13T12:01:51.543 回答