保存用户的喜好最好的方法?(Best approach to save user preferenc

2019-06-24 22:33发布

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

方法1:序列化他们的用户表的列的一个省

方法2:创建一个单独的表的喜好和做出的has_many关联来自用户的喜好。

你喜欢哪种,什么是各自的优点和缺点比其他上述两种方法中的一种?

Answer 1:

它通常是有利于正常化是一个好主意。 第二个解决方案让您的车型更清洁,使得如果添加了新的偏好方便的可扩展性,并保持你的表整洁。



Answer 2:

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

序列化在一个单一的属性

为您的Rails应用程序简单的用户喜好是描述如何做到这一点博客文章。

编辑在形成系列化哈希? 介绍了如何在一个表格编辑这样的哈希值。 一个有用的技巧是使窗体从OpenStruct.new(@user.preferences)散列来自动为每个散列属性存取方法。

染料/ has_serialized - GitHub上让你把在序列化哈希的属性上的(用户)模型的属性。

在一个单独的表首

最佳实践来存储用户设置? 有一些提示。 下面是一些库其中包括两个由@hopeless另一个答案。

  • 轨道的设置管理一样存储在数据库中你一个散列,使用简单的ActiveRecord像操作方法键/值对的表。 您可以存储任何类型的对象:字符串,数字,数组,或可记为YAML任何对象。 (测试使用Rails 3.1和更新的包括Rails 4.x和滑轨5.x的)
  • 首福是好简单的布尔偏好,使用单个列多个偏好。(最后更新2009)
  • 首更加灵活,使用一个单独的表,一些不错的语法糖。 (最后更新2011)
  • HasEasy存储在垂直表中的数据,但允许您添加验证,前/后存储处理,类型等(最后更新2008)

您也可以尝试使用元编程: 实用的元编程和Ruby:存储偏好设置



Answer 3:

第一种方法的改进版本,可如果你对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/更多细节(迁移)和处理布尔特别说明。



Answer 4:

方法2

您可以添加的喜好,不会搞乱用户表



Answer 5:

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

  • 首福 (好简单的布尔偏好,使用单个列多个偏好)
  • 首 (更灵活,使用一个单独的表,一些不错的语法糖)


Answer 6:

我会接近2,因为它是更清洁和更容易更新。 您将能够选择要添加更多的偏好一样复杂。

这将是一个慢一点,因为你有一个连接的事,但它会是值得的



Answer 7:

在2016年,我将支持选项2。

为什么?

用户设置往往会成为一个核心部分每一个应用程序的。 如果他们是在每次请求检索到的,你现在让每个请求额外查询。 使用一个单独的表是有道理的,当你必须有每个设置单独的列。 但是,由于我们使用jsonb,这不是一个问题。 这只是一列。

阅读更多



文章来源: Best approach to save user preferences?