所以我有一个余烬数据模型,我希望我的用户能够为每个项目创建不同/更多的DS.attr并随意调用它们。这将把json发送到我使用mondodb的rails服务器。然后,我可以检查是否已定义密钥,如果没有为此文档创建密钥并将其保存在mongo中。
问题是你在扩展DS.Model时必须对所有DS.attr进行硬编码,但我当时并不知道所有这些。
有没有办法重新打开DS.Model并以某种方式循环传递的json密钥(或者我可以将allKeys字段中的所有密钥从rails传递给客户端)。
然后当有人想要创建不同的属性时,我可以动态地重新打开模型并添加此DS.attr?
任何人有任何想法如何做到这一点,或者它是否可能?
任何帮助,例子或想法都很棒!
非常感谢 瑞克
答案 0 :(得分:2)
假设您拥有App.Post
模型,并且您希望用户为帖子存储其他属性。首先创建一个模型App.MyModelTypes
并将所有模型类型存储在其中:
App.MyModelTypes = DS.Model.extend({
modelType: DS.attr('string') // e.g. App.Post, App.Comment
attributes: DS.hasMany('App.Attribute')
});
然后你的App.Post
应该:
App.Post = DS.Model.extend({
title: DS.attr('string'),
body: DS.attr('string'),
// ... other base attributes
});
定义模型App.Attribute
,如下所示:
App.Attribute = DS.Model.extend({
name: DS.attr('string')
attrType: DS.attr('string'),
theModelType: DS.belongsTo('App.Model'),
attributeValues: DS.hasMany('App.AttributeValue')
});
当用户为帖子创建新属性时,应用应创建属于App.MyModelType App.Attribute
的新App.Post
。
最后,您需要一个模型来存储帖子的自定义属性值:
App.AttributeValue = DS.Model.extend({
theModelType: DS.belongsTo('App.MyModelTypes'),
targetId: DS.attr('number'),
attribute: DS.belongsTo('App.Attribute'),
value: DS.attr('string') // attribute.attrType will give us the type
});
当用户修改某个帖子的属性值时,您将post.id
存储在targetId
,theModelType
您存储的App.Post
中等等。
请告诉我这是否适合您。