определение отношений в Backbone-Relational не уверены, в каком направлении указывают параметры?

У меня чертовски много времени на изучение документации для Backbone-Relational; не на 100% ясно, к какому отношению добавлять такие вещи, как includeInJSON. Вероятно, лучше всего описать мое замешательство, проиллюстрировав структуру, которую я пытаюсь создать. У меня есть модель Venue, которая имеет ноль или более вложенных моделей Address (отношение 1:n). Бэкенд-хранилищем является MongoDB, в котором могут быть встроенные объекты. Я хотел бы сохранить его в этом формате:

{
    id: 12345,
    label: 'OPUS Cafe Bistro',
    addresses: [
        {
            type: 'mailing',
            address1: '#52 - 650 Duncan Ave',
            city: 'Penticton, BC'
        },
        {
            type: 'main',
            address1: '#106 - 1475 Fairview Rd',
            city: 'Penticton, BC'
        }
    ]
}

(Пожалуйста, не обращайте внимания на уродливые структуры данных; я изменил его для краткости.) Теперь я считаю, что установил связь между Venue и Address таким образом:

var Venue = Backbone.RelationalModel.extend({
    relations: [
        {
            type: Backbone.HasMany,
            key: 'addresses',
            relatedModel: 'Address',
            includeInJSON: false,
            collectionType: 'Addresses',
            reverseRelation: {
                key: 'venue'
            }
        }
});

Если я правильно понимаю, я установил для includeInJSON значение false, чтобы предотвратить сериализацию Venue в ключ venue в Address, но в reverseRelation я оставляю includeInJSON пустым, чтобы полное Address (без свойства места проведения) сериализовалось как массив в свойстве addresses объекта Venue — как, например, я надеялся. Правильный?

Точно так же я пытаюсь понять ту же концепцию в отношении отношений в стиле соединения. Учтите, что Venue теперь имеет поле organisationID:

/* venue in JSON format  */
{
    id: 12345,
    organisationID: 336,
    label: 'OPUS Cafe Bistro',
    addresses: []
}

/* and now for the organisation */
{
    id: 336,
    label: 'OPUS Entertainment Group'
}

Используя примеры в документации, которые, кажется, предпочитают отношения Backbone.HasMany, я думаю, что мне нужно настроить Organisation таким образом:

var Organisation = Backbone.RelationalModel.extend({
    relations: [
        {
            type: Backbone:HasMany,
            key: 'venues',
            relatedModel: 'Venue',
            includeInJSON: Backbone.Model.prototype.idAttribute,
            collectionType: 'Venues',
            reverseRelation: {
                key: 'organisationID',
                includeInJSON: false
            }
        }
    ]
});

... который должен сериализоваться в приведенный выше пример, верно? (То есть, Venue захватывает id Organisation и вставляет его в organisationID, а Organisation не сериализует список Venues)

Заранее спасибо за любую помощь — с нетерпением жду возможности использовать эту удобную библиотеку после того, как выцарапал себе глаза, пытаясь написать свой собственный реляционный клей для Backbone.js :-)


person Paul d'Aoust    schedule 05.10.2011    source источник


Ответы (1)


(копирую мой ответ с https://github.com/PaulUithol/Backbone-relational/issues/37 здесь, надеюсь, его найдет больше людей)

Я уверен, что вы уже поняли это, извините за столь поздний ответ, но просто чтобы быть уверенным: параметры (например, collectionType и includeInJSON) применяются к key, который находится в том же объекте.

Итак, для вашего первого примера вы можете написать отношение как:

var Venue = Backbone.RelationalModel.extend({
    relations: [
        {
            type: Backbone.HasMany,
            key: 'addresses',
            relatedModel: 'Address',
            includeInJSON: true,
            collectionType: 'Addresses',
            reverseRelation: {
                key: 'venue',
                includeInJSON: 'id'
            }
        }
});

Это создаст место, которое HasMany addresses. Ключ addresses для любого заданного места использует collectionType Addresses и полностью сериализуется, поскольку includeInJSON имеет значение true (не то, чтобы значение по умолчанию для includeInJSON также равно true; поэтому, если вы его не укажете, он будет полностью сериализовать relation или reverseRelation).

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

person Paul    schedule 02.11.2011
comment
Вау! спасибо, что обнаружили мой двойной пост и нашли время, чтобы обновить мой вопрос здесь! - person Paul d'Aoust; 03.11.2011