Lorraine Bernard
Lorraine Bernard

Reputation: 13400

Backbone-relational between two models

By using Backbone-relational I would like to have the model task in this way:

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

I did try this way (1) but the result is the following (2).

Any ideas?


(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
};

Upvotes: 2

Views: 1439

Answers (1)

Edward M Smith
Edward M Smith

Reputation: 10627

Not sure what your the exact JSON is for your Task model, so I'm guessing here.

Backbone-relational is expecting either a fully nested model:

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

Or a string/number, which it will assume to be the id of the related model:

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

I'm guessing you're hitting the second case, based on the null value you're getting for the user model.

When backbone-relational instantiates an instance of a model, and the related model is a "key" string/number, it will search its internal store of models to try to find a matching model. If it finds it, it sets that model as the value for the user property.

If it cannot find the model, it stashes the key in the model's relevant relation property model._relations[n].keyContents, and sets the user value to null.

It is at this point that you would use the fetchRelated function to get the related model from the datastore/API.

So, try calling task.fetchRelated() to get the related user model:

task.fetchRelated('user');

Upvotes: 2

Related Questions