Ember数据一对多关系不起作用

时间:2015-03-25 00:58:08

标签: javascript ember.js ember-data

我对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')来获取其配置文件。

奇怪的是,我的附件关系(位置有很多附件)完美无缺。

我错过了什么吗?我做错了什么导致这种关系失败?

我有三种模式:

locatons->

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);
    }
});

/路由/位置/索引

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') 返回"Jack White"这是正确的,但我不清楚为什么这个变化会产生影响。边加载(放置相关对象的id并包括这些对象的顶级数组)是否仅适用于ember数据中的一对多关系?

欢迎任何和所有输入,我仍然是新的数据。

3 个答案:

答案 0 :(得分:1)

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
}

答案 1 :(得分:1)

我发现解决方案是在json中将profile_id: xx重命名为profile: xx。我假设model_id是注意所属关系的正确方法,但事实证明,ember只需要模型名称。希望这有助于将来的某个人!

答案 2 :(得分:0)

我可能在这里愚蠢,但您的位置模型没有个人资料字段 - 可能是因为它属于个人资料。但是,如果没有该字段,您将无法在位置上执行.get(' profile')。