具有一对一关系的嵌入式json模型
我寻找了一个关于这是如何工作的清晰解释,但还没有找到。我正在寻找一个清晰详细的解释,假设我是所有这些框架的新手 所以我的问题是,我正在编写一个应用程序,前端使用Ember.js(带有Ember cli),后端使用Java中的Play框架。我正试图让我的前端消化一些来自API的json。以下是json:具有一对一关系的嵌入式json模型,json,ember.js,ember-data,Json,Ember.js,Ember Data,我寻找了一个关于这是如何工作的清晰解释,但还没有找到。我正在寻找一个清晰详细的解释,假设我是所有这些框架的新手 所以我的问题是,我正在编写一个应用程序,前端使用Ember.js(带有Ember cli),后端使用Java中的Play框架。我正试图让我的前端消化一些来自API的json。以下是json: { "buildings": [ { "id": 0, "createdDateTime": "2015-03-27T06:39:19.913
{
"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
}]
}
下面是我的代码:
//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模型、从ember cli导出以及以下内容如何工作)。有人能详细解释一下它是如何工作的吗(带有EmbeddedRecordsMixin的RESTSerializer、{embedded:'always'}属性和其他可用选项)?任何澄清都将不胜感激
让我们也把它带到下一个层次,比如说我不希望每个地址都有一个id,因为它们不应该被使用超过一次(不能在同一个地址有两个建筑物)。我将如何实现这一点?也许我会将地址存储在db中我的building对象的同一记录中,而不需要额外的地址表。基于这些解决方案,最好的方法是什么(如果有更好的解决方案,请随时提出)
请注意,我已经阅读了以下链接:
- (这并没有说任何关于EmbeddedRecordsMixin的事情)
- (谈论App.Adapter.Map,我也不明白)
- (非常有趣的项目,可能正是我想要的)
谢谢大家! 您的大多数问题的答案都可以通过仔细阅读 具体而言: 使用{embedded:'always'}作为DS.attr的选项是无效的 设置嵌入式记录的方法 (意思是只要你确定了你对关系的归属,你就很好) 及 资源{embedded:'always'}的attrs选项是简写的 用于: 但真正的答案是,一切都在代码中!读一读,再往下看一点,写得很好,你应该能够追踪到底发生了什么 基本上,一旦您告诉序列化程序有嵌入的记录(通过
{key:{embedded:{everys'}}
),它就会在JSON中找到该键,并将其反序列化为一个Ember对象(只要它找到一个定义的带有该键的Ember对象,在您的情况下是“address”)
至于你们的下一个问题,我想回答我自己的问题:你们的大楼有租户吗?如果是这样的话,它们可能会有地址,您可能希望通过tenant.address而不是tenant.building.address访问它,所以请继续将address设置为自己的表。这可能会在不久的将来帮你省去一些麻烦。谢谢你的回答!我一回到家就要去更深入地看一看。好问题,但答案是否定的,这里的建筑对象不会有任何租户。如果是这样的话,我会百分之百同意你。但在我的情况下,它将(而且必须)遵循严格的1对1关系。快速评论,说我听从了你的建议,仔细阅读了文件。我找到了我所有的答案(来自医生和你的答案)。我还尝试了ember-data.model-fragments,它就像一个符咒!它使您能够处理没有任何id的嵌套对象。我确实理解EmberJs为何尝试强制执行它,但在某些情况下,此工具非常有用,可以避免在后端添加不可用的id字段。再次感谢你!好交易。很乐意帮忙。我知道有一种叫做模型碎片的东西。双赢。
1 {
2 serialize: 'records',
3 deserialize: 'records'
4 }