Поле отношения RelationalModel в NULL после выполнения работы

У меня проблема с WTF, которую я не могу понять. Я объясняю:

У меня есть модель с именем Product:

var Product = Backbone.RelationalModel.extend(
{
    urlRoot: Backbone.rootApiUrl + '/products',
    defaults: {
        id: '',
        name: '',
        description: '',
        current_price: '',
        categories: '',
        duration: '',
        shipping_cost: '',
        start_date: '',
        user_id: null,
        is_buy_it_now: ''
    },

    relation: [{
        type: Backbone.HasOne,
        key: 'user_id',
        relatedModel: User,
        autoFetch: true
    }]
});

Мое поле user_id является внешним ключом для одного пользователя (который также является моделью в магистрали):

var User = Backbone.RelationalModel.extend(
{
    urlRoot: Backbone.rootApiUrl + '/users',
    defaults: {
        id: '',
        name: '',
        email: '',
        firstname: '',
        lastname: '',
        password: '',
        card_nb: '',
        cart_total: ''
    }
});

Мои отношения выборки отлично работают в каждой отдельной модели. Но когда я ставлю связь между Product.user_id и моя модель пользователя, происходит ошибка wtf.

Я перепробовал все возможное: все ключи (keySource, keyDestination........... со всеми возможными значениями). Я даже установил контрольные точки в Relation Lib, чтобы иметь возможность наблюдать за тем, что произошло... Ничего не сказать. Даже Stackru не знает эту ошибку:P (Или я плохо искал)

Последняя проблема:

  • Мой продукт правильно отправлен через API и установлен в Backbone (ОК).
  • Поле user_id сначала устанавливается в число в ответе API продукта, а затем устанавливается равным NULL значением Relational, а не заменяется объектом User (ПОЧЕМУ?)
  • Когда я смотрю мой сетевой отладчик, Relational вызывает API для объекта User (здесь все в порядке) с user_id номер (ОК). Ответ сервера хороший, с правильным пользователем в формате JSON (ОК). Но Relational не связывает этот объект ответа с полем user_id, который сейчас.... NULL (НЕ ОК).
    • Таким образом, я потерял объект User (но я могу console.log(), если я поместил функцию успеха в autoFetch), неправильно привязанный к его родительскому продукту с полем user_id,

РЕДАКТИРОВАТЬ: JSFiddle доступен здесь http://jsfiddle.net/gjdass/WNWrm/ (будьте осторожны, API может долго отвечать, около 10 секунд, это нормально).

Заранее спасибо: / Извините за время, которое вы можете уделить этому.

3 ответа

Он ведет себя иначе, если вы удалите значение по умолчанию user_id? Интересно, выбирает ли это отношение, а затем применяет значение по умолчанию null,

Вы также можете попробовать установить Backbone.Relational.showWarnings в true если это еще не так, и проверьте вашу консоль на наличие каких-либо предупреждений.

Дайте этому шанс:

    relations: [{
        type: Backbone.HasOne,
        key: 'id',
        keyDestination: 'user_id',
        includeInJSON: 'user_id',
        autoFetch: true,
        relatedModel: User
    }]

Я не мог сделать головы или хвосты из основной документации. По-видимому key Предполагается, что он ссылается на идентификатор связанной модели, но, похоже, не делает этого ни в одном из своих примеров. Интересно, работают ли их примеры на самом деле? Во всяком случае, я думаю, что это решает вашу проблему: настройка key к ключу от связанной модели и настройки keyDestination а также includeInJSON поэтому он знает, как установить и сериализовать результат в объект продукта.

Поэтому, если вы внимательно посмотрите на основную реляционную документацию, вы заметите, что ни один из примеров, которые они приводят, не является HasOne с обратной связью HasMany. Таким образом, кажется, что функциональность не проверена (кроме вас!) И не функционирует. Попробуйте отношения по-другому:

var User = Backbone.RelationalModel.extend(
{

    urlRoot: 'http://noraj.fr:5000/users',
    defaults: {
        id: '',
        name: '',
        email: '',
        firstname: '',
        lastname: '',
        password: '',
        card_nb: '',
        cart_total: ''
    },

    relations: [{
        type: Backbone.HasMany,
        key: 'products',
        relatedModel: 'Product',
        reverseRelation: {
            key: 'id',
            keySource: 'user_id',
            keyDestination: 'user_id',
            includeInJSON: true
        }            
    }]            
});
// Product Model
var Product = Backbone.RelationalModel.extend(
{

    urlRoot: 'http://noraj.fr:5000/products',
    defaults: {
        id: '',
        name: '',
        description: '',
        current_price: '',
        categories: '',
        duration: '',
        shipping_cost: '',
        start_date: '',
        is_buy_it_now: '',
        user_id: null
    }        
});