Магистрально-реляционная связь между двумя моделями

Используя Backbone-relational, я хотел бы получить модельную задачу следующим образом:

task = {
    id: 1
    assigned_id: 2
    name: 'read a book',
    user: userModel
};

Я пробовал этот способ (1), но результат следующий (2).

Есть идеи?


(1)

var User = Backbone.RelationalModel.extend({
    // urlRoot
});

var Task = Backbone.RelationalModel.extend({
        relations: [
            {
                type: Backbone.HasOne,
                key: 'user',
                relatedModel: User
            }
        ],

        // urlRoot
});

(2)

task = {
    id: 1
    assigned_id: 2
    name: 'read a book',
    user: null // null instead of having something related to user model
};

person Lorraine Bernard    schedule 28.06.2012    source источник


Ответы (1)


Не уверен, какой у вас точный JSON для вашей модели задачи, поэтому я предполагаю, что здесь.

Backbone-relational ожидает либо полностью вложенную модель:

task = {
    id: 1
    assigned_id: 2
    name: 'read a book',
    user: {
               name: 'Fred Rogers',
               id: 42,
               occupation: 'Hero'
          }
};

Или строка/число, которое будет считаться идентификатором связанной модели:

task = {
    id: 1
    assigned_id: 2
    name: 'read a book',
    user: 42
};

Я предполагаю, что вы столкнулись со вторым случаем, основываясь на значении null, которое вы получаете для пользовательской модели.

Когда backbone-relational создает экземпляр модели, а связанная модель является «ключевой» строкой/числом, он будет искать во внутреннем хранилище моделей, чтобы попытаться найти подходящую модель. Если он находит его, он устанавливает эту модель в качестве значения свойства пользователя.

Если он не может найти модель, он прячет ключ в соответствующем свойстве отношения модели model._relations[n].keyContents и устанавливает пользовательское значение null.

Именно в этот момент вы должны использовать функцию fetchRelated для получить связанную модель из хранилища данных/API.

Итак, попробуйте вызвать task.fetchRelated(), чтобы получить соответствующую модель пользователя:

task.fetchRelated('user');
person Edward M Smith    schedule 29.06.2012