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

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

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

对我来说,这个声音就像一个完美的例子,你想要使用一个免费的NoSQL数据库。

或者(如果你想坚持使用SQL),你可以拥有一个带有has_many :attributes关联的基本User模型。 其中属性只是一个key (’age’,’birthday’,’hair color’)和一个值的组合。 复杂性带有不同的数据类型和同时覆盖多个属性的查询。

以下是两个选项。 1. NoSQL数据库。 2. Rails 4商店function。

如果您正在使用Postgresql,您可以查看hstore然后您可以保存序列化的信息,实际上您可以对这些哈希进行一些查询btw Rails 4包含此function但是如果您使用的是较旧的Rails版本,则可以包含此gem。 你的Gemfile中的https://github.com/diogob/activerecord-postgres-hstore你可以开始玩:

 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 

您的架构可能如下:

 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 

您可以获取和设置帐户数据值

例如user.age =>将返回用户的年龄

user.hair_color = 'brown' =>将设置头发颜色

我建议去NoSQL数据库。 它们是专门为这种情况设计的,所以你不必做疯狂的事情来使事情有效。 MongoDB与MongoID相结合是一个非常可靠的解决方案。

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

如果你想继续使用关系数据库,那就为它做了一个gem

https://github.com/Liooo/dynabute