Rails:模型上的动态列/属性?

时间:2014-09-25 02:48:18

标签: ruby-on-rails ruby database ruby-on-rails-4 database-design

我有一个SaaS应用程序,帐户希望在用户模型上保存不同类型的信息。因此,例如,一个帐户可能想要保存年龄和生日,但在另一个帐户中,他们将不会使用这些列,并且希望保存关于头发颜色和高度的信息。

这些只是示例,但我如何构建我的模型和数据库,以便它可以很好地与“自定义,动态”列一起使用而不会创建太多空属性。

6 个答案:

答案 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数据库。它们是专门为这种情况设计的,所以你不必做疯狂的事情来使事情发挥作用。 MongoDBMongoID相结合是一个非常可靠的解决方案。

唯一的缺点可能是托管,因为它往往略微,至少,更昂贵。

答案 5 :(得分:0)

为此,如果您想继续使用关系数据库,就成为一颗宝石

https://github.com/Liooo/dynabute