canJS: загрузить модель с ассоциациями, но сохранить только "базовую" модель

Вот демонстрация того, как загрузить модель с ассоциациями (в одном запросе) в canJS. Я нашел его в github-репозитории canJS, и на самом деле мне пришлось немного переписать его, чтобы он работал (он устарел), но теперь он работает.

Моя проблема в том, что если я меняю загруженный контакт (contact.attr('name', 'Tom');), а затем я хочу сохранить его (contact.save();), затем контакт, а также задачи контакта будут опубликованы через ajax на сервере для сохранения. Это логично, потому что tasks является атрибутом contact,

Моя проблема в том, что я хочу только контакт name, birthday а также id быть опубликованным при обновлении записи. Я, вероятно, должен переопределить makeRequest метод и удалить tasks перед публикацией на сервер, но я думаю, что должно быть более элегантное решение.

Надеемся, что здесь найдутся пользователи canJS, которые уже справились с этой ситуацией.

1 ответ

Решение

Я сам искал решение этой самой проблемы и придумал свой собственный, вдохновленный предложением trickey на форуме JavascriptMVC в этом посте об изменении serialize() модельный метод, чтобы сделать его более приятным с Rails.

Как и его предложение, я создал собственное расширение класса Model и добавил include поле в моих моделях, где вы можете перечислить атрибуты, которые вы хотели бы включить (скопировано после метода Rails as_json).

can.Model("BaseModel", {}, {
  serialize: function() {
    var data, retval, serialized;
    data = {};
    retval = {};
    serialized = can.Model.prototype.serialize.call(this);
    //check if we're using the "include" fields or not
    if (typeof this.constructor.include !== 'undefined') {
      can.each(this.constructor.include, function(attr) {
        data[attr] = serialized[attr];
      });
    } else {
      data = serialized;
    }
    //wrap the return value in the model name for Rails purposes, e.g. {"event": {data}}
    retval[this.constructor._shortName] = data;
    return retval;
  }
});

Затем в моей модели я использую массив include, чтобы указать, какие поля я хочу включить. Опуская "посетители" и "докладчики", эти связанные модели не будут упакованы в мой сериализованный JSON, который отправляется обратно на сервер.

Event = BaseModel.extend('Event', {
  findAll: "GET /admin/events",
  findOne: "GET /admin/events/{id}",
  create: "POST /admin/events",
  update: "PUT /admin/events/{id}",
  destroy: "DELETE /admin/events/{id}",
  attributes: {
    attendees: 'Models.User.models',
    speakers: 'Models.User.models'
  },
  include: ['id', 'name', 'start_time', 'end_time']
}, {});
Другие вопросы по тегам