Определение отношений в 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'
}
}
});
Это создаст место, которое HasMany
addresses
, addresses
ключ для любого данного объекта использует collectionType
Addresses
и полностью сериализован, потому что includeInJSON
установлен в true
(не то, что значение по умолчанию для includeInJSON
это также true
; так что если вы не укажете это, он будет полностью сериализовать relation
или же reverseRelation
).
reverseRelation
просто принимает те же параметры, только применяет их в отношении venue
ключ на любой адрес. В этом случае он будет только сериализовать venue.id
собственность для места, с которым это связано.