我想知道存储用户设置的最佳方法是什么?对于Web 2.0应用程序,我希望用户能够选择某些设置。目前只是在接收电子邮件通知时。
最简单的方法是创建一个模型“设置”并为每个设置添加一列,然后与用户建立1-1关系。
但有更好的解决方案吗?将信息存储在用户表本身中可能更好吗?或者我应该使用带有“settings_name”和“settings_value”的表格来完全打开存储在那里的设置类型(在添加选项时不必运行任何迁移)?
您有什么看法?
由于
答案 0 :(得分:12)
如果您使用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']
答案 1 :(得分:11)
“开放”表方法难以使用AR进行建模,因为您必须担心数据的类型(布尔值,整数,字符串等)。我总是在用户表上添加prefs作为列,然后将它们移出到user_preferences表,如果它们“太多”的话。它很简单,而且很容易使用。
答案 2 :(得分: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"}
答案 3 :(得分:6)
我们使用名为HasEasy的有用插件。它将数据存储在垂直表中,但允许您添加验证,前/后存储处理,类型等。
答案 4 :(得分:0)
Rails 6支持可用于解决此问题的ActiveRecordStore。通过添加类型定义来改进ActiveRecordStore的宝石是activerecord-typedstore。
定义模型中的属性:
class User < ApplicationRecord
typed_store :settings do |s|
s.boolean :public, default: false, null: false
s.string :email
s.datetime :publish_at
s.integer :age, null: false
end
end
并且可以使用它:
shop = Shop.new(email: 'george@cyclim.se')
shop.public? # => false
shop.email # => 'george@cyclim.se'
shop.published_at # => nil