Ruby on rails多态模型:动态字段

时间:2011-03-22 22:36:14

标签: ruby-on-rails ruby-on-rails-3 mongodb mongoid

假设我有基础模型类Item

class Item
  include Mongoid::Document
  field :category
end

每个类别确定项目应包含哪些字段。例如,“category1”中的项目应包含名为text的其他字符串字段,“category2”中的项目应包含字段weightcolor。所有字段都是基本类型:字符串,整数等。

这些附加值将作为文档的字段存储在mongodb中:

> db.items.find()                                                   
{ "_id" : ObjectId("4d891f5178146536877e1e99"), "category" : "category1", "text" : "blah-blah" }
{ "_id" : ObjectId("4d891f7878146536877e1e9a"), "category" : "category2", "weight" : 20, "color" : "red" }

类别也存储在mongodb中。字段的配置由管理员在运行时定义。

> db.categories.find()                                                                 
{ "_id" : "category1", "fields" : [ { "name" : "text", "type" : "String" } ] }
{ "_id" : "category2", "fields" : [
    {
        "name" : "weight",
        "type" : "Integer"
    },
    {
        "name" : "color",
        "type" : "String"
    }
] }

用户需要编辑带有html表单的项目,为包含特定项目类别的所有其他字段输入值。

问题是

我可以采取哪些方法在rails上实现这种多态性?

请通过评论询问所需的详细信息。

1 个答案:

答案 0 :(得分:0)

只需将Item子类化,Mongoid将负责休息,例如:存储类型。

class TextItem < Item; end

Rails会喜欢它,但你可能想要使用#becomes方法,因为它会使表单构建器更快乐,并且路径生成更容易:

https://github.com/romanbsd/mongoid/commit/9c2fbf4b7b1bc0f602da4b059323565ab1df3cd6