开发者

Ruby on rails polymorphic model: dynamic fields

Suppose I have base model class Item

class Item
  include Mongoid::Document
  field :category
end

Each category determines which fields should item contain. For example, items in "category1" should contain additional string field named text, items in "category2" should contain fields weight and color. All the fields are of basic types: strings, integers and so on.

These additional values are to be stored in mongodb as document's fields:

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

Categories are stored in the mongodb, too. Fields' configuration is defined at runtime by an administrator.

> db.categories.find()                                                                 
{ "_id" : "category1", "fields" : [ { "name" : "text", "type" : "String" } ] }
{ "_id" : "cate开发者_高级运维gory2", "fields" : [
    {
        "name" : "weight",
        "type" : "Integer"
    },
    {
        "name" : "color",
        "type" : "String"
    }
] }

Users need to edit Items with html forms entering values for all additional fields defined for the category of particular item.

The question is

What approaches could I take to implement this polymorphism on rails?

Please ask for required details with comments.


Just subclass the Item, and Mongoid will take care of rest, e.g. storing type.

class TextItem < Item; end

Rails will like it, but you'll probably want to use #becomes method, as it will make form builder happy and path generation easier:

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

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜