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

时间:2009-07-03 14:53:37

标签: ruby-on-rails preferences

我在保存用户首选项时看到了两种不同的方法。

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

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

您更喜欢上述两种方法中的哪一种,以及每种方法的优缺点是什么?

7 个答案:

答案 0 :(得分:22)

赞成规范化通常是一个好主意。第二种解决方案可以使您的模型更清晰,如果添加了新的首选项,则可以轻松扩展,并使您的表格保持整洁。

答案 1 :(得分:18)

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

在单个属性中序列化

Simple user preferences for your Rails app是一篇描述如何执行此操作的博文。

Edit a serialized hash in a form?描述了如何在表单中编辑此类哈希。 一个有用的技巧是使表单从OpenStruct.new(@user.preferences)哈希自动为每个哈希属性创建访问器方法。

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

单独表格中的偏好

Best practice to store user settings?有一些提示。下面是一些libs,其中包括来自@hopeless的另一个回答。

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

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

答案 2 :(得分: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)

方法2

您可以添加偏好设置,而不会弄乱用户表

答案 4 :(得分:3)

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

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

答案 5 :(得分:1)

接近2 ,因为它更干净,更容易更新。您可以根据需要添加更多偏好。

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

答案 6 :(得分:0)

2016年,我会支持选项2

为什么?

  

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

Read more