【问题标题】:Best approach to save user preferences? [closed]保存用户偏好的最佳方法? [关闭]
【发布时间】:2010-11-07 23:02:14
【问题描述】:

我见过两种不同的保存用户偏好的方法。

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

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

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

【问题讨论】:

  • 您存储的是什么类型的首选项?布尔值?多个项目?
  • @hopeless - 那将是多个项目。我倾向于选项 2,但是通过查看 rails serialize 选项,我觉得使用 Hash 作为选项,选项 1 可以或多或少类似于选项 1 来完成,因为没有另一个表和更多的 SQL 连接。任何反馈表示赞赏。另外,你们把 USERS 表弄得乱七八糟是什么意思,所有的偏好都将只存储在偏好列中。
  • @satynos - 混乱意味着用户表现在更加混乱,因为它不仅仅是(我假设)保存登录/名称信息。如果您正在序列化,那么当您需要查找内容时,这意味着更多的工作。基本上,每次你需要知道一个时,你都必须解析所有的偏好。将首选项(如果只有几个)作为字段放在用户表上比 blob o' 首选项更好,因为您不必查看所有首选项即可找到一个。
  • 感谢您的反馈,所以选择 2。
  • “基本上,每次你需要知道一个偏好时,你都必须解析所有的偏好”——是的,解析 YAML 的速度非常快。 FWIW,这里没有人给出任何真正的理由,这是纯粹的宗教。

标签: ruby-on-rails preferences


【解决方案1】:

支持标准化通常是个好主意。第二种解决方案使您的模型更简洁,在添加新首选项时可以轻松扩展,并让您的表格保持整洁。

【讨论】:

    【解决方案2】:

    我也遇到了同样的问题,所以我想我会分享我在“社区 wiki”答案中找到的内容。

    在单个属性中序列化

    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? 有一些提示。以下是一些库,其中两个来自@hopeless 的另一个答案。

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

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

    【讨论】:

      【解决方案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/

      【讨论】:

        【解决方案4】:

        方法二

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

        【讨论】:

          【解决方案5】:

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

          • Preference-fu(适合简单 布尔首选项,对多个首选项使用一列)
          • Preferences (更灵活,使用单独的表格,一些不错的语法糖)

          【讨论】:

          • prefereneces 似乎已弃用。它不适用于 Rails 4。
          【解决方案6】:

          我会接近 2,因为它更简洁且更易于更新。您将能够根据需要添加更多复杂的首选项。

          因为你要加入,所以会慢一点,但这是值得的

          【讨论】:

            【解决方案7】:

            2016 年,我会支持选项 2

            为什么?

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

            Read more

            【讨论】:

              猜你喜欢
              • 2023-03-06
              • 2020-08-12
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2016-10-25
              • 2018-04-10
              • 1970-01-01
              • 2019-01-17
              相关资源
              最近更新 更多