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']
}, {});