Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 保存用户首选项的最佳方法?_Ruby On Rails_Preferences - Fatal编程技术网

Ruby on rails 保存用户首选项的最佳方法?

Ruby on rails 保存用户首选项的最佳方法?,ruby-on-rails,preferences,Ruby On Rails,Preferences,我看到了两种不同的保存用户偏好的方法 方法1: 序列化它们并保存在USERS表的一列中 方法2: 创建一个单独的表首选项并使用户与首选项之间有许多关联 以上两种方法中,您更喜欢哪一种?它们各自的优缺点是什么?方法2 您可以添加首选项,而不会弄乱用户表支持规范化通常是个好主意。第二种解决方案使您的模型更干净,如果添加了新的首选项,则允许轻松扩展,并使您的表保持整洁。有一些Rails插件可以处理此用例: (对于简单的 布尔首选项,将一列用于多个首选项) (更灵活,使用单独的表格,一些漂亮的语法糖

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

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

方法2: 创建一个单独的表首选项并使用户与首选项之间有许多关联

以上两种方法中,您更喜欢哪一种?它们各自的优缺点是什么?

方法2


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

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

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

  • (对于简单的 布尔首选项,将一列用于多个首选项)
  • (更灵活,使用单独的表格,一些漂亮的语法糖)

我选择方法2,因为它更干净,更容易更新。您将能够添加更多您想要的复杂首选项


由于您有一个连接要做,所以速度会慢一点,但这是值得的

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

在单个属性中序列化 是一篇描述如何做到这一点的博客文章

描述如何在表单中编辑此类哈希。 一个有用的技巧是从
OpenStruct.new(@user.preferences)
hash生成表单,以自动为每个hash属性生成访问器方法

允许您将序列化哈希中的那些属性视为(用户)模型上的属性

首选项在单独的表中 我有一些建议。下面是一些LIB,包括来自@appect的另一个答案的两个LIB

  • 使用简单的类似ActiveRecord的操作方法,管理一个键/值对表,就像存储在数据库中的哈希一样。您可以存储任何类型的对象:字符串、数字、数组或任何可以标记为YAML的对象。(使用Rails 3.1和更新版本(包括Rails 4.x和Rails 5.x)进行测试)
  • 适用于简单的布尔首选项,使用一列表示多个首选项。(上次更新于2009年)
  • 更灵活,使用一个单独的表,一些不错的语法糖。(最新更新日期:2011年)
  • 将数据存储在垂直表中,但允许您添加验证、存储前/后处理、类型等(上次更新于2008年)
您也可以尝试使用元编程:

如果您使用的是PostgreSQL 9.2/3+和Rails 4+,则可以使用第一种方法的改进版本。您可以使用
store\u accessor
在PostgreSQL hstore列中存储首选项,并支持验证和查询

class User
  store_accessor :preferences, :receive_newsletter

  validates :receive_newsletter, presence: true
end
user.receive\u新闻稿=>true'

User.where(“首选项->'receive\u newsletter'='true')


有关更多详细信息(迁移)和处理布尔值的特别说明,请参见。

2016年,我将支持选项2

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


您存储的首选项类型是什么?布尔值?多个项目?@无望-那将是多个项目。我倾向于选择2,但通过查看rails序列化选项,我觉得可以使用哈希作为选项,选项1可以通过不使用另一个表和更多SQL连接来实现,或多或少类似于选项1。任何反馈都将不胜感激。同样,你们所说的混乱用户表的意思是,所有的首选项都将只存储在首选项列中。@satynos-clart意味着用户表现在更加混乱,因为它不仅仅(我假设)保存登录名信息。如果您正在序列化,这意味着在需要查找内容时也需要进行更多的工作。基本上,每次需要了解一个偏好时,都必须解析所有的偏好。将pref(如果只有几个)作为字段放在用户表上要比blob o'pref好,因为你不必查看所有的pref就可以找到一个。谢谢你的反馈,所以选择2就是了。“基本上,每次你需要知道一个时,你都必须解析所有的首选项”——是的,解析YAML非常快。FWIW,这里没有人给出任何真正的理由,这是纯粹的宗教。
偏好
似乎不受欢迎。它不适用于Rails 4。