【问题标题】:Ember Data relationships being overwrittenEmber 数据关系被覆盖
【发布时间】:2014-03-10 16:39:51
【问题描述】:

我现在在两个不同的实例上遇到了这个问题,但它们都是同一个问题。首先是我的一个问题实例的模型:

主持人:

Minicron.Host = DS.Model.extend({
  hostname: DS.attr('string'),
  name: DS.attr('string'),
  created_at: DS.attr('date'),

  jobs: DS.hasMany('job')
});

工作:

Minicron.Job = DS.Model.extend({
  name: DS.attr('string'),
  command: DS.attr('string'),
  created_at: DS.attr('date'),

  host: DS.belongsTo('host')
});

我的工作模型收到的 JSON:

{
  "jobs":[
    {
      "id":"94e81ce07cec25451ce711fce3d96bea",
      "name":"uname -a",
      "command":"uname -a",
      "created_at":"2014-03-10T16:25:08Z",
      "host":{
        "id":8,
        "hostname":"lucid32",
        "name":"lucid32",
        "created_at":"2014-03-08T18:13:52Z"
      },
      "executions":[
        {
          "id":406,
          "job_id":"94e81ce07cec25451ce711fce3d96bea",
          "host_id":8,
          "created_at":"2014-03-09T18:15:28Z",
          "started_at":"2014-03-09T18:15:28Z",
          "finished_at":"2014-03-09T18:15:28Z",
          "exit_status":0
        }
      ]
    }
  ]
}

主机模型接收的 JSON 是:

{
  "hosts":[
    {
      "id":8,
      "hostname":"lucid32",
      "name":"lucid32",
      "created_at":"2014-03-08T18:13:52Z",
      "jobs":[
        {
          "id":"94e81ce07cec25451ce711fce3d96bea",
          "name":"uname -a",
          "command":"uname -a",
          "host_id":8,
          "created_at":"2014-03-10T16:25:08Z"
        }
      ]
    }
  ]
}

我遇到的问题是当我的主机模型被加载时,作业模型的主机关系似乎被覆盖了。我认为这是因为在 JSON 中,主机拥有的每个作业都有 host_id 参数,而 ember 正在用基本上什么都没有替换它所知道的关于该主机的现有数据。我的 API 是一个 Sinatra 应用程序,它使用 activerecord 和 activemodel 将我的模型序列化为 JSON,所以我真的没有一种简单的方法可以从响应中删除 host_id。

还值得注意的是,我在这里使用了自定义序列化程序 http://mozmonkey.com/2013/12/loading-json-with-embedded-records-into-ember-data-1-0-0-beta/,没有它我无法让 Ember 识别我的旁加载数据。

这几天我一直在尝试解决这个问题,但我完全没有想法:(

如果您有任何问题以及是否有帮助,请告诉我,我的应用的完整源代码位于 GitHub https://github.com/jamesrwhite/minicron/tree/master/lib/minicron/hub

谢谢!

【问题讨论】:

    标签: ember.js ember-data


    【解决方案1】:

    您可以将 Active Model Serializers gem 添加到您的 Sinatra 应用程序并从响应中删除 host_id:

    class JobSerializer < ActiveModel::Serializer 
    
      attributes :created_at, :started_at, :finished_at, :exit_status
    
    end
    

    【讨论】:

    猜你喜欢
    • 2019-10-14
    • 1970-01-01
    • 2015-11-17
    • 1970-01-01
    • 2021-07-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多