Определение отношений в 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 ложно, чтобы предотвратить Venue от сериализации в venue ключ в Address, но при обратной связи я ухожу 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 грейферы Organisation"s id и вставляет его в organisationID, а также Organisation не сериализует какой-либо список Venues)

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

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

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

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

Другие вопросы по тегам