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

Embedded json model with one-to-one relationship

我搜索了有关其工作原理的明确解释,但尚未找到。我正在寻找一个清晰而详细的解释,假设我是所有这些框架的新手。

所以这是我的问题,我正在编写一个应用程序,前端使用 Ember.js(使用 Ember-cli),后端在 Java 中的 Play-framework 下。我正在尝试让我的前端消化一些 json 来自我的 API。这是 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'}
    }
});

这不会引发任何错误并且工作正常。问题是,我不完全理解 building 中嵌入对象 address 的代码(我确实理解 DS 如何建模,export 从 ember-cli 和 belongsTo 工作)。有人能详细解释一下它是如何工作的吗(带有 EmbeddedRecordsMixin 的 RESTSerializer、{embedded: 'always'} 属性和其他可用选项)?任何澄清将不胜感激。

让我们更上一层楼,假设我不想为每个地址分配一个 ID,因为它们永远不会被使用超过一次(同一地址不能有 2 座建筑物)。我将如何实现这一目标?也许我会将地址存储在数据库中我的建筑对象的同一记录中,并且不希望地址有额外的 table。基于这些解决方案,最好的方法是什么(如果有更好的解决方案,请随时提出)?

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

谢谢!

您可以通过仔细阅读 EmbeddedRecordsMixin Docs

找到大部分问题的答案

具体来说:

using { embedded: 'always' } as an option to DS.attr is not a valid way to setup embedded records.

(意思是只要你定义了你的 belongsTo 关系就很好)

The attrs option for a resource { embedded: 'always' } is shorthand for:

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

但真正的答案是,一切都在代码中!去读一读here and a little bit further down here,写得很好,你应该能追踪到发生了什么。

基本上,一旦您告诉序列化程序存在嵌入记录(通过 {key: {embedded: 'always' } }),它就会在您的 JSON 中找到该键并将其反序列化为 Ember对象(只要它找到具有该键的已定义 Ember 对象,在您的情况下 'address')。

至于你的下一级问题,我会用我自己的问题来回答:你的建筑物有租户吗?如果是这样,他们可能会有地址,您可能希望通过 tenant.address 而不是 tenant.building.address 访问它,所以请继续将地址设为自己的 table。它可能会在不久的将来为您省去一些麻烦。