Связывание данных Ember Data

Сейчас я столкнулся с этой проблемой в двух отдельных экземплярах, но они представляют собой одну и ту же проблему. Во-первых, это мои модели для одного экземпляра проблемы:

хост:

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

Благодарю!

1 ответ

Вы можете добавить Gamer Serializer Active Model в ваше приложение Sinatra и удалить host_id из ответа:

class JobSerializer < ActiveModel::Serializer 

 attributes :created_at, :started_at, :finished_at, :exit_status

end

licensed under cc by-sa 3.0 with attribution.