嵌入式json模型,具有一对一的关系

时间:2015-03-27 08:00:04

标签: json ember.js ember-data

我搜索了一个关于它是如何工作的明确解释,但还没有找到。我正在寻找一个清晰而详细的解释,假设我是所有这些框架的新手。

所以这是我的问题,我正在使用Ember.js(使用Ember-cli)和Java下的Play-framework下的后端编​​写应用程序。我正试图让我的前端消化一些从我的API中出来的json。这是json:

{
    "buildings": [
     {
         "id": 0,
         "createdDateTime": "2015-03-27T06:39:19.913Z",
         "address": {
             "id": 1,
             "city": "City",
             "civicNumber": 1287,
             "country": "Canada",
             "postalZipCode": "G1Q1Q9",
             "provinceOrState": "QC",
             "streetName": "A Street Name"
         },
         "cost": 1000000,
         "earnings": 2300,
         "mainPicturePath": "http://dummyimage.com/200x200/999/fff.png&text=Building",
         "type": "DUPLEX",
         "yearOfBuilt": 1998
    },
    {
        "id": 1,
        "createdDateTime": "2015-03-27T06:39:19.935Z",
        "address": {
            "id": 2,
            "city": "City",
            "civicNumber": 1289,
            "country": "Canada",
            "postalZipCode": "G1Q1Q9",
            "provinceOrState": "QC",
            "streetName": "A Street Name"
        },
        "cost": 980000,
        "earnings": 670,
        "mainPicturePath": "http://dummyimage.com/200x200/999/fff.png&text=Building",
        "type": "TRIPLEX",
        "yearOfBuilt": 1980
    }]
}

这是我的emberjs代码:

//models/building.js
export default DS.Model.extend({
    type: DS.attr('string'),
    address: DS.belongsTo('address', {embedded: 'always'}),
    cost: DS.attr('number'),
    yearOfBuilt: DS.attr('number'),
    earnings: DS.attr('number'),
    createdDateTime: DS.attr('date'),
    mainPicturePath: DS.attr('string')
});

//models/address.js
export default DS.Model.extend({
    civicNumber: DS.attr('number'),
    streetName: DS.attr('string'),
    city: DS.attr('string'),
    provinceOrState: DS.attr('string'),
    country: DS.attr('string'),
    postalZipCode: DS.attr('string'),
    building: DS.belongsTo('building', {embedded: 'always'})
});

//serializers/building.js
export default DS.RESTSerializer.extend(DS.EmbeddedRecordsMixin, {
    attrs: {
        address: {embedded: 'always'}
    }
});

这不会引发任何错误并且正常工作。问题是,我不完全理解构建中嵌入对象地址的代码(我确实理解DS模型, export >来自ember-cli和 belongsTo 的工作)。有人可以详细解释我它是如何工作的(带有EmbeddedRecordsMixin的RESTSerializer,{embedded:'always'}属性和其他可用选项)?任何澄清都将得到更多的赞赏。

让我们把它提升到一个新的水平,比如说我不希望每个地址都有一个id,因为它们永远不会被使用多次(不能在同一个地址有2个建筑物)。我怎么做到这一点?也许我会将地址存储在数据库中我的构建对象的相同记录中,并且不需要额外的地址表。基于这些解决方案,最好的方法是什么(如果有的话,可以随意提出更好的解决方案)?

请注意,我已阅读以下链接:

谢谢!

1 个答案:

答案 0 :(得分:1)

通过仔细阅读EmbeddedRecordsMixin Docs

,可以找到大部分问题的答案

具体来说:

  

使用{embedded:' always' }作为DS.attr的选项不是有效的   设置嵌入式记录的方法。

(意思是只要你定义了你所属的关系,你就会很好)

  

资源的attrs选项{embedded:' always'是简写   为:

1 {   
2   serialize: 'records',   
3   deserialize: 'records' 
4 }

但真正的答案是,它完全在代码中!请继续阅读here并稍微向下here,它写得非常好,您应该能够追踪正在发生的事情。

基本上发生的事情是,一旦你告诉序列化器有嵌入的记录(通过{key: {embedded: 'always' } }),它会在你的JSON中找到该密钥并将其反序列化为Ember对象(只要它找到一个定义的Ember)具有该密钥的对象,在您的情况下,地址')。

就您的下一级问题而言,我会回答我自己的问题:您的建筑物是否有租户?如果是这样,他们可能会有地址,你可能想要通过tenant.address而不是tenant.building.address来访问它,所以继续进行地址并将其设置为自己的表。它可能会在不久的将来为您节省一些麻烦。