определение отношений в Backbone-Relational - не уверены, в каком направлении указываются параметры? - PullRequest
3 голосов
/ 05 октября 2011

У меня очень много времени на понимание документации для 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 захватывает Organisation id и вставляет его в organisationID, а Organisation не сериализует список Venues)

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

1 Ответ

4 голосов
/ 02 ноября 2011

(копируя мой ответ с 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 только для места, с которым он связан.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...