我有一个SaaS应用程序,帐户希望在用户模型上保存不同类型的信息。因此,例如,一个帐户可能想要保存年龄和生日,但在另一个帐户中,他们将不会使用这些列,并且希望保存关于头发颜色和高度的信息。
这些只是示例,但我如何构建我的模型和数据库,以便它可以很好地与“自定义,动态”列一起使用而不会创建太多空属性。
答案 0 :(得分:7)
以下是两个选项。 1. NoSQL数据库。 2. Rails 4 Store功能。
答案 1 :(得分:5)
对我来说,这个声音就像一个完美的例子,你想要使用一个免费的NoSQL数据库。
或者(如果您想坚持使用SQL),您可以拥有一个User
基础has_many :attributes
模型。其中属性只是key
('年龄','生日','头发颜色')和值的组合。复杂性带有不同的数据类型和同时覆盖多个属性的查询。
答案 2 :(得分:1)
If you're using Postgresql you can take a look at hstore then you can save the information serialized and actually you can make some queries against those hashes btw Rails 4 has included this feature but if you are using an older Rails version you can include this gem. https://github.com/diogob/activerecord-postgres-hstore in your Gemfile and you should be able to start playing like:
user = User.new
user.preferences = {
email: "p@elh.mx",
github: "heridev"
}
user.save!
user.reload
# Searching
User.where("preferences @> hstore(:key, :value)", key: "email", value: "p@elh.mx").first
答案 3 :(得分:0)
您的架构可能如下:
create_table "accounts", :force => true do |t|
t.integer "user_id"
t.string "data_key"
t.string "data_value"
end
帐户模型
belongs_to :user
DATA_KEYS = ['age', 'birthdate', 'hair_color', 'height' ] # etc..
用户模型
has_many :accounts
Account::DATA_KEYS.each do |method|
# getter method
define_method(method) do
accounts.find_by_data_key(method).try(:data_value)
end
# setter method
define_method("#{method}=") do |value|
data = accounts.find_or_initialize_by_data_key(method)
data.data_value = value.strip
data.save
end
end
您可以获取和设置帐户数据值
E.g。 user.age
=>将返回用户年龄
user.hair_color = 'brown'
=>将设置头发颜色
答案 4 :(得分:0)
我建议去NoSQL数据库。它们是专门为这种情况设计的,所以你不必做疯狂的事情来使事情发挥作用。 MongoDB与MongoID相结合是一个非常可靠的解决方案。
唯一的缺点可能是托管,因为它往往略微,至少,更昂贵。
答案 5 :(得分:0)
为此,如果您想继续使用关系数据库,就成为一颗宝石