余辉数据动态数DS.attr's

时间:2012-11-13 14:10:22

标签: ruby-on-rails mongodb ember.js ember-data mongomapper

所以我有一个余烬数据模型,我希望我的用户能够为每个项目创建不同/更多的DS.attr并随意调用它们。这将把json发送到我使用mondodb的rails服务器。然后,我可以检查是否已定义密钥,如果没有为此文档创建密钥并将其保存在mongo中。

问题是你在扩展DS.Model时必须对所有DS.attr进行硬编码,但我当时并不知道所有这些。

有没有办法重新打开DS.Model并以某种方式循环传递的json密钥(或者我可以将allKeys字段中的所有密钥从rails传递给客户端)。

然后当有人想要创建不同的属性时,我可以动态地重新打开模型并添加此DS.attr?

任何人有任何想法如何做到这一点,或者它是否可能?

任何帮助,例子或想法都很棒!

非常感谢 瑞克

1 个答案:

答案 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存储在targetIdtheModelType您存储的App.Post中等等。

请告诉我这是否适合您。