具有一对一关系的嵌入式 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。基于这些解决方案,最好的方法是什么(如果有更好的解决方案,请随时提出)?
请注意,我已经阅读了以下链接:
- http://mozmonkey.com/2013/12/loading-json-with-embedded-records-into-ember-data-1-0-0-beta/(没有提及 EmbeddedRecordsMixin)
- How to access nested object in json with Ember data(说的是我也不懂的App.Adapter.Map)
- https://github.com/lytics/ember-data.model-fragments(非常有趣的项目,可能会退出,正是我要找的)
谢谢!
您可以通过仔细阅读 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。它可能会在不久的将来为您省去一些麻烦。
我搜索了有关其工作原理的明确解释,但尚未找到。我正在寻找一个清晰而详细的解释,假设我是所有这些框架的新手。
所以这是我的问题,我正在编写一个应用程序,前端使用 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。基于这些解决方案,最好的方法是什么(如果有更好的解决方案,请随时提出)?
请注意,我已经阅读了以下链接:
- http://mozmonkey.com/2013/12/loading-json-with-embedded-records-into-ember-data-1-0-0-beta/(没有提及 EmbeddedRecordsMixin)
- How to access nested object in json with Ember data(说的是我也不懂的App.Adapter.Map)
- https://github.com/lytics/ember-data.model-fragments(非常有趣的项目,可能会退出,正是我要找的)
谢谢!
您可以通过仔细阅读 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。它可能会在不久的将来为您省去一些麻烦。