我曾看到过两种不同的保存用户偏好设置的方法。
方法1: 将它们序列化并保存在USERS表的一列中。
方法2: 创建一个单独的PREFERENCES表,并从USERS到PREFERENCES建立has_many关联。
你更喜欢上述两种方法中的哪一种,它们各自相对于另一种的优缺点是什么?
我曾看到过两种不同的保存用户偏好设置的方法。
方法1: 将它们序列化并保存在USERS表的一列中。
方法2: 创建一个单独的PREFERENCES表,并从USERS到PREFERENCES建立has_many关联。
你更喜欢上述两种方法中的哪一种,它们各自相对于另一种的优缺点是什么?
通常最好优先选择规范化。第二种解决方案使你的模型更加清晰,如果新增偏好时易于扩展,并使表格保持简洁。
我曾经也遇到了同样的问题,所以我想分享一下我在“社区维基”答案中找到的内容。
为你的Rails应用程序提供简单的用户偏好设置是一篇博客文章,介绍了如何实现此功能。
在表单中编辑序列化的哈希?描述了如何在表单中编辑这样的哈希。一个有用的技巧是使用OpenStruct.new(@user.preferences)
哈希来创建表单,自动为每个哈希属性生成访问器方法。
DYE/has_serialized - GitHub使您可以将序列化哈希中的这些属性视为模型(用户)上的属性。
存储用户设置的最佳实践?有一些提示。以下是包括@hopeless另一个答案中的两个库。
你也可以尝试使用元编程:Ruby 元编程实践:存储偏好设置
如果你正在使用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/了解更多细节(迁移)以及处理布尔值的特殊注意事项。
方法二
您可以添加偏好设置,而不会使用户表过于混乱
有一些可以处理这个用例的Rails插件:
我会选择方法2,因为它更加简洁易懂且方便更新。你可以添加任意复杂的偏好设置。
虽然速度会稍微慢一些,但是这个选择将是值得的。
在2016年,我会支持选项2。
用户设置往往成为每个应用程序的核心部分。如果它们在每个请求中被检索,那么现在每个请求都需要进行额外的查询。当您必须为每个设置拥有单独的列时,使用单独的表是有意义的。但由于我们使用jsonb,这不是问题。它只是一个单独的列。