保存用户偏好的最佳方法?

Dha*_*udi 46 ruby-on-rails preferences

我已经看到两种不同的方法来保存用户首选项.

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

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

您更喜欢上述两种方法中的哪一种,以及每种方法的优缺点是什么?

Pes*_*sto 22

赞成规范化通常是个好主意.第二种解决方案可以使您的模型更加清晰,如果添加了新的首选项,则可以轻松扩展,并使您的表格保持整洁.


Tur*_*adg 20

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

序列化单个属性

您的Rails应用程序的简单用户首选项是一篇描述如何执行此操作的博客文章.

在表单中编辑序列化哈希?描述了如何在表单中编辑这样的哈希.一个有用的技巧是使表单从OpenStruct.new(@user.preferences)哈希自动为每个哈希属性创建访问器方法.

DYE/has_serialized - GitHub允许您将序列化哈希中的这些属性视为(用户)模型上的属性.

单独表格中的首选项

存储用户设置的最佳做法?有一些提示.下面是一些库,包括@hopeless的另一个回答中的两个.

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

您还可以尝试使用元编程: Ruby实用元编程:存储首选项


sma*_*sma 5

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

class User
  store_accessor :preferences, :receive_newsletter

  validates :receive_newsletter, presence: true
end
Run Code Online (Sandbox Code Playgroud)

user.receive_newsletter => 'true'

User.where("preferences->'receive_newsletter' = 'true'")

有关更多详细信息(迁移),请参阅http://mikecoutermarsh.com/using-hstore-with-rails-4/以及有关处理布尔值的特别说明.