Rails:存储用户设置的最佳做法?

Ole*_*ann 25 settings user-controls ruby-on-rails

我想知道存储用户设置的最佳方法是什么?对于Web 2.0应用程序,我希望用户能够选择某些设置.目前只是在接收电子邮件通知时.

最简单的方法是创建一个模型"设置",并为每个设置都有一个列,然后与用户建立1-1关系.

但有更好的解决方案吗?将信息存储在用户表本身中可能更好吗?或者我应该使用带有"settings_name"和"settings_value"的表格来完全打开存储在那里的设置类型(添加选项时无需运行任何迁移)?

你有什么意见?

谢谢

joa*_*lho 13

如果您使用PostgreSQL,最好的解决方案是使用https://github.com/diogob/activerecord-postgres-hstore/.这是一种在数据库中存储哈希的简单,快速和可靠的方法.由于它不仅仅是一个序列化的文本字段,您也可以在其上进行搜索,而不需要像在HasEasy中那样创建新表.

def User
  serialize :preferences, ActiveRecord::Coders::Hstore
end

user = User.create preferences: { theme: "navy" }
user.preferences['theme']
Run Code Online (Sandbox Code Playgroud)

  • 在rails4上你不再需要宝石!检查[这个操作方法](http://mikecoutermarsh.com/using-hstore-with-rails-4/) (7认同)

Jon*_*ian 11

"开放"表方法使得难以使用AR进行建模,因为您必须担心数据类型(布尔值,整数,字符串等).我总是在用户表上添加prefs作为列,然后将它们移出到user_preferences表,如果它们"太多"的话.它很简单,而且很容易使用.


ban*_*tic 10

如果用户设置无法找到(例如,通过User.find_by_x_preference),您还可以将它们作为哈希存储在序列化列中.实际上,这是rails docs(http://www.railsbrain.com/api/rails-2.3.2/doc/index.html?a=M002334&name=serialize#)中描述的用例.

class User < ActiveRecord::Base
  serialize :preferences
end

u = User.new
u.preferences = {:favorite_color => "green", :favorite_book => "Moby Dick"}
Run Code Online (Sandbox Code Playgroud)

  • 我用这种技术遇到的问题是,当你添加一个新的首选项,即```:favorite_food => pizza```时,没有简单的方法为所有用户设置默认设置,如果有的话一个简单的DB列. (3认同)
  • 很干净但是它是"查找+解析"而不仅仅是"查找".如果您经常使用应用程序逻辑设置,这可能会降低您的速度. (2认同)

sco*_*ttd 7

我们使用名为HasEasy的有用插件.它将数据存储在垂直表中,但允许您添加验证,前/后存储处理,类型等.

  • 检查维护的叉子https://github.com/exceed/preferential/ (2认同)