【问题标题】:Embedded json model with one-to-one relationship具有一对一关系的嵌入式 json 模型
【发布时间】:2015-05-31 11:51:40
【问题描述】:

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

所以这是我的问题,我正在使用 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'}
    }
});

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

让我们也把这个提升到一个新的水平,比如说我不想为每个地址都有一个 id,因为它们永远不应该被使用超过一次(不能有 2 个建筑物在同一个地址)。我将如何实现这一目标?也许我会将地址存储在数据库中我的建筑对象的同一记录中,并且不想要一个额外的地址表。根据这些解决方案,最好的方法是什么(如果有,请随时提出更好的解决方案)?

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

谢谢!

【问题讨论】:

    标签: json ember.js ember-data


    【解决方案1】:

    仔细阅读EmbeddedRecordsMixin Docs可以找到大部分问题的答案

    具体来说:

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

    (意味着只要你定义了 belongsTo 关系,你就可以了)

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

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

    但真正的答案是,一切都在代码中!去阅读here,再往下读一点here,它写得很好,你应该能够追踪到发生了什么。

    基本上,一旦你告诉序列化程序有嵌入的记录(通过{key: {embedded: 'always' } }),它就会在你的 JSON 中找到那个键并将其反序列化为一个 Ember 对象(只要它找到一个定义的 Ember 对象那个键,在你的情况下是“地址”)。

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

    【讨论】:

    • 感谢您的回答!回家后我会去深入看看。好问题,但答案是否定的,这里的建筑对象不会有任何租户。如果是这样,我会 100% 同意你的看法。但就我而言,它将(并且必须)遵循严格的一对一关系。
    • 快速评论说我听从了您的建议并认真阅读了文档。我找到了所有答案(来自文档和您的答案)。我还尝试了 ember-data.model-fragments,它就像一个魅力!它使您能够使用没有任何 id 的嵌套对象。我确实理解 EmberJs 为何尝试强制执行它,但在某些情况下,此工具非常有用,可以避免在后端添加无用的 id 字段。再次感谢您!
    • 好交易。乐意效劳。我了解到有一种叫做模型片段的东西。双赢。
    猜你喜欢
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2019-08-25
    • 1970-01-01
    • 2014-05-20
    • 2013-04-09
    • 2015-01-26
    • 2016-08-25
    相关资源
    最近更新 更多