Ember 数据一对多关系无效
Ember Data one to many relationship not working
我是 ember 的新手,但我想知道这是否是我的逻辑问题,或者 ember.
中是否存在某些功能不正常的问题
当我尝试 model.get('profile')
我得到空值。
我已经能够像这样检索配置文件模型:
this.store.find('profile', 17);
我还可以向位置模型添加一个 profile_id 属性,然后使用它
var location = this.modelFor('location');
var profile = this.store.find('profile', 17);
但是根据我在文档中找到的内容,我应该能够在位置对象上使用 .get('profile')
来获取其配置文件。
奇怪的是我的附件关系(位置有很多附件)工作得很好。
我错过了什么吗?我做错了什么导致这段关系失败?
我有三个模型:
位置->
export default DS.Model.extend({
image: DS.attr('string'),
latitude:DS.attr('string'),
longitude:DS.attr('string'),
outlets:DS.attr('string'),
parking:DS.attr('string'),
internet:DS.attr('string'),
credit_cards:DS.attr('string'),
share_url:DS.attr('string'),
roaster:DS.attr('string'),
about:DS.attr('string'),
name: DS.attr('string'),
address: DS.attr('string'),
images: DS.attr('string'),
attachments: DS.hasMany('attachment'),
profile: DS.belongsTo('profile'),
curator_image: DS.attr('string'),
curator_about: DS.attr('string'),
curator_name: DS.attr('string'),
style_image_url: function(){
return "background-image:url('" + this.get("image") + "')";
}.property("image"),
style_profile_image_url: function(){
return "background-image:url('" + this.get("curator_image") + "')";
}.property("curator_image"),
});
附件 ->
export default DS.Model.extend({
location: DS.belongsTo('location'),
image:DS.attr('string')
});
个人资料 ->
export default DS.Model.extend({
location: DS.hasMany('location'),
name:DS.attr('string'),
about:DS.attr('string'),
image:DS.attr('string'),
});
这是来自服务器的示例响应:
locations.json
{
attachments: [
{
id: 254,
image: "https://dripper-dev.s3-us-west-1.amazonaws.com/uploads/large_9443c014-69e1-4616-943d-e627a47f8306.jpg?AWSAccessKeyId=AKIAJPYWBHET4VVL5NUA&Signature=nD3YMiuFiHtpuTPop77Q%2BS6N9HM%3D&Expires=1427847353"
},
{
id: 250,
image: "https://dripper-dev.s3-us-west-1.amazonaws.com/uploads/large_3e562933-5ce2-4f91-bb6f-6fe6883e0463.jpg?AWSAccessKeyId=AKIAJPYWBHET4VVL5NUA&Signature=ESbhuHNjx9kD63gJY3UVRsHs2B8%3D&Expires=1427847353"
}],
locations: [
{
id: 12,
latitude: "45.550346",
longitude: "-122.666584",
address: "3808 North Williams Avenue, Portland, OR 97212, USA",
outlets_text: "Yes",
internet_text: "No",
roaster: "Ristretto Roasters",
parking_text: "Yes",
credit_cards: true,
image: "https://dripper-dev.s3-us-west-1.amazonaws.com/uploads/medium_9b676fc6-814c-4f5f-a03b-5a5f650fc7aa.jpg?AWSAccessKeyId=AKIAJPYWBHET4VVL5NUA&Signature=w5pSN5iJbtlWfiFo2UMcJMN6pAs%3D&Expires=1427847347",
name: "Ristretto",
twitter_username: null,
curator_image: "https://dripper-dev.s3-us-west-1.amazonaws.com/uploads/basic_uploader/Profile/9d77af52-033b-4bd9-8cb4-8b961f366392.jpg?AWSAccessKeyId=AKIAJPYWBHET4VVL5NUA&Signature=YsgxmH%2B5wmlOpVSoti5kn0DozKQ%3D&Expires=1427847347",
curator_name: "Jack White",
curator_about: "this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test ",
profile_id: 17,
attachment_ids: [
30
]
},
...
路线:
/routes/location.js
export default Ember.Route.extend({
model: function(params) {
return this.store.find('location', params.location_id);
}
});
/routes/location/指数
export default Ember.Route.extend({
model: function() {
return this.modelFor('location').get('profile');
}
});
更新:
我能够通过将 json 更改为:
来获取配置文件模型
{
attachments: [],
locations: [
{
id: 12,
latitude: "45.550346",
longitude: "-122.666584",
address: "3808 North Williams Avenue, Portland, OR 97212, USA",
outlets_text: "Yes",
internet_text: "No",
roaster: "Ristretto Roasters",
parking_text: "Yes",
credit_cards: true,
image: "https://dripper-dev.s3-us-west-1.amazonaws.com/uploads/medium_9b676fc6-814c-4f5f-a03b-5a5f650fc7aa.jpg?AWSAccessKeyId=AKIAJPYWBHET4VVL5NUA&Signature=bhPpdV6bxroZZ0Lfk2jN6aPht7A%3D&Expires=1427916453",
name: "Ristretto",
twitter_username: null,
curator_image: "https://dripper-dev.s3-us-west-1.amazonaws.com/uploads/basic_uploader/Profile/9d77af52-033b-4bd9-8cb4-8b961f366392.jpg?AWSAccessKeyId=AKIAJPYWBHET4VVL5NUA&Signature=K1VuT3Oe8ncTdX%2FA9H7s4XJcQ84%3D&Expires=1427916453",
curator_name: "Jack White",
curator_about: "this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test ",
profile_id: 17,
profile: {
id: 17,
name: "Jack White",
about: "this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test ",
action_url: null,
action_caption: null,
published: null,
image: {
url: "https://dripper-dev.s3-us-west-1.amazonaws.com/uploads/basic_uploader/Profile/9d77af52-033b-4bd9-8cb4-8b961f366392.jpg?AWSAccessKeyId=AKIAJPYWBHET4VVL5NUA&Signature=E%2BgWHlMRcIXDeMOTmLhfdU8YyTc%3D&Expires=1427916459"
},
user_id: 9,
created_at: "2015-03-24T20:07:31.043Z",
updated_at: "2015-03-24T20:09:01.518Z"
},
attachment_ids: [
30
]
}, ...
在通往 window.loc 的路线中保存我的位置对象,然后在浏览器控制台中检查:
loc.get('profile').get('name')
returns "Jack White"
这是正确的,但我不清楚为什么这个改变会产生影响。侧面加载(放置相关对象的 ID 并包括这些对象的顶级数组)是否仅适用于 ember 数据中的一对多关系?
欢迎任何输入,我对 ember 数据还是个新手。
我在这里可能有点傻,但是您的 Location 模型没有 Profile 字段 - 大概是因为它属于 Profile。但是,如果没有该字段,您将无法在 Location.
上执行 .get('profile')
您的 locations.json
中没有侧面加载的配置文件对象,就像附件一样。它应该看起来更像:
{
locations: [{
id: 12,
...
profile_id: 17,
attachment_ids: [...]
}],
attachments: [...],
profiles: [...] /* for multiple profiles, or*/
profile: {...} /* for a single side-loaded model */
}
...
否则,如果您想异步加载 profile
模型,您需要在 location
模型中声明如下:
profile: DS.belongsTo('profile', {
async: true
}
我发现解决方案是在 json 中将 profile_id: xx
重命名为 profile: xx
。我假设 model_id 是记录属于关系的正确方法,但结果 ember 只需要模型名称。希望这对以后的人有帮助!
我是 ember 的新手,但我想知道这是否是我的逻辑问题,或者 ember.
中是否存在某些功能不正常的问题当我尝试 model.get('profile')
我得到空值。
我已经能够像这样检索配置文件模型:
this.store.find('profile', 17);
我还可以向位置模型添加一个 profile_id 属性,然后使用它
var location = this.modelFor('location');
var profile = this.store.find('profile', 17);
但是根据我在文档中找到的内容,我应该能够在位置对象上使用 .get('profile')
来获取其配置文件。
奇怪的是我的附件关系(位置有很多附件)工作得很好。
我错过了什么吗?我做错了什么导致这段关系失败?
我有三个模型:
位置->
export default DS.Model.extend({
image: DS.attr('string'),
latitude:DS.attr('string'),
longitude:DS.attr('string'),
outlets:DS.attr('string'),
parking:DS.attr('string'),
internet:DS.attr('string'),
credit_cards:DS.attr('string'),
share_url:DS.attr('string'),
roaster:DS.attr('string'),
about:DS.attr('string'),
name: DS.attr('string'),
address: DS.attr('string'),
images: DS.attr('string'),
attachments: DS.hasMany('attachment'),
profile: DS.belongsTo('profile'),
curator_image: DS.attr('string'),
curator_about: DS.attr('string'),
curator_name: DS.attr('string'),
style_image_url: function(){
return "background-image:url('" + this.get("image") + "')";
}.property("image"),
style_profile_image_url: function(){
return "background-image:url('" + this.get("curator_image") + "')";
}.property("curator_image"),
});
附件 ->
export default DS.Model.extend({
location: DS.belongsTo('location'),
image:DS.attr('string')
});
个人资料 ->
export default DS.Model.extend({
location: DS.hasMany('location'),
name:DS.attr('string'),
about:DS.attr('string'),
image:DS.attr('string'),
});
这是来自服务器的示例响应: locations.json
{
attachments: [
{
id: 254,
image: "https://dripper-dev.s3-us-west-1.amazonaws.com/uploads/large_9443c014-69e1-4616-943d-e627a47f8306.jpg?AWSAccessKeyId=AKIAJPYWBHET4VVL5NUA&Signature=nD3YMiuFiHtpuTPop77Q%2BS6N9HM%3D&Expires=1427847353"
},
{
id: 250,
image: "https://dripper-dev.s3-us-west-1.amazonaws.com/uploads/large_3e562933-5ce2-4f91-bb6f-6fe6883e0463.jpg?AWSAccessKeyId=AKIAJPYWBHET4VVL5NUA&Signature=ESbhuHNjx9kD63gJY3UVRsHs2B8%3D&Expires=1427847353"
}],
locations: [
{
id: 12,
latitude: "45.550346",
longitude: "-122.666584",
address: "3808 North Williams Avenue, Portland, OR 97212, USA",
outlets_text: "Yes",
internet_text: "No",
roaster: "Ristretto Roasters",
parking_text: "Yes",
credit_cards: true,
image: "https://dripper-dev.s3-us-west-1.amazonaws.com/uploads/medium_9b676fc6-814c-4f5f-a03b-5a5f650fc7aa.jpg?AWSAccessKeyId=AKIAJPYWBHET4VVL5NUA&Signature=w5pSN5iJbtlWfiFo2UMcJMN6pAs%3D&Expires=1427847347",
name: "Ristretto",
twitter_username: null,
curator_image: "https://dripper-dev.s3-us-west-1.amazonaws.com/uploads/basic_uploader/Profile/9d77af52-033b-4bd9-8cb4-8b961f366392.jpg?AWSAccessKeyId=AKIAJPYWBHET4VVL5NUA&Signature=YsgxmH%2B5wmlOpVSoti5kn0DozKQ%3D&Expires=1427847347",
curator_name: "Jack White",
curator_about: "this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test ",
profile_id: 17,
attachment_ids: [
30
]
},
...
路线: /routes/location.js
export default Ember.Route.extend({
model: function(params) {
return this.store.find('location', params.location_id);
}
});
/routes/location/指数
export default Ember.Route.extend({
model: function() {
return this.modelFor('location').get('profile');
}
});
更新: 我能够通过将 json 更改为:
来获取配置文件模型{
attachments: [],
locations: [
{
id: 12,
latitude: "45.550346",
longitude: "-122.666584",
address: "3808 North Williams Avenue, Portland, OR 97212, USA",
outlets_text: "Yes",
internet_text: "No",
roaster: "Ristretto Roasters",
parking_text: "Yes",
credit_cards: true,
image: "https://dripper-dev.s3-us-west-1.amazonaws.com/uploads/medium_9b676fc6-814c-4f5f-a03b-5a5f650fc7aa.jpg?AWSAccessKeyId=AKIAJPYWBHET4VVL5NUA&Signature=bhPpdV6bxroZZ0Lfk2jN6aPht7A%3D&Expires=1427916453",
name: "Ristretto",
twitter_username: null,
curator_image: "https://dripper-dev.s3-us-west-1.amazonaws.com/uploads/basic_uploader/Profile/9d77af52-033b-4bd9-8cb4-8b961f366392.jpg?AWSAccessKeyId=AKIAJPYWBHET4VVL5NUA&Signature=K1VuT3Oe8ncTdX%2FA9H7s4XJcQ84%3D&Expires=1427916453",
curator_name: "Jack White",
curator_about: "this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test ",
profile_id: 17,
profile: {
id: 17,
name: "Jack White",
about: "this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test this is a test ",
action_url: null,
action_caption: null,
published: null,
image: {
url: "https://dripper-dev.s3-us-west-1.amazonaws.com/uploads/basic_uploader/Profile/9d77af52-033b-4bd9-8cb4-8b961f366392.jpg?AWSAccessKeyId=AKIAJPYWBHET4VVL5NUA&Signature=E%2BgWHlMRcIXDeMOTmLhfdU8YyTc%3D&Expires=1427916459"
},
user_id: 9,
created_at: "2015-03-24T20:07:31.043Z",
updated_at: "2015-03-24T20:09:01.518Z"
},
attachment_ids: [
30
]
}, ...
在通往 window.loc 的路线中保存我的位置对象,然后在浏览器控制台中检查:
loc.get('profile').get('name')
returns "Jack White"
这是正确的,但我不清楚为什么这个改变会产生影响。侧面加载(放置相关对象的 ID 并包括这些对象的顶级数组)是否仅适用于 ember 数据中的一对多关系?
欢迎任何输入,我对 ember 数据还是个新手。
我在这里可能有点傻,但是您的 Location 模型没有 Profile 字段 - 大概是因为它属于 Profile。但是,如果没有该字段,您将无法在 Location.
上执行 .get('profile')您的 locations.json
中没有侧面加载的配置文件对象,就像附件一样。它应该看起来更像:
{
locations: [{
id: 12,
...
profile_id: 17,
attachment_ids: [...]
}],
attachments: [...],
profiles: [...] /* for multiple profiles, or*/
profile: {...} /* for a single side-loaded model */
}
...
否则,如果您想异步加载 profile
模型,您需要在 location
模型中声明如下:
profile: DS.belongsTo('profile', {
async: true
}
我发现解决方案是在 json 中将 profile_id: xx
重命名为 profile: xx
。我假设 model_id 是记录属于关系的正确方法,但结果 ember 只需要模型名称。希望这对以后的人有帮助!