最好的方法来保存用户的喜好?
我已经看到两种不同的方法来保存用户的喜好。
方法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,这不是一个问题。 这只是一个专栏。
阅读更多