假设我有基础模型类Item
class Item
include Mongoid::Document
field :category
end
每个类别确定项目应包含哪些字段。例如,“category1”中的项目应包含名为text
的其他字符串字段,“category2”中的项目应包含字段weight
和color
。所有字段都是基本类型:字符串,整数等。
这些附加值将作为文档的字段存储在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上实现这种多态性?
请通过评论询问所需的详细信息。
答案 0 :(得分:0)
只需将Item子类化,Mongoid将负责休息,例如:存储类型。
class TextItem < Item; end
Rails会喜欢它,但你可能想要使用#becomes方法,因为它会使表单构建器更快乐,并且路径生成更容易:
https://github.com/romanbsd/mongoid/commit/9c2fbf4b7b1bc0f602da4b059323565ab1df3cd6