2017-02-24 14 views
0

소셜 네트워킹 사이트의 프로필 시스템을 만들고 있습니다. 관계를 사용하여 다른 테이블의 사용자에 대한 다양한 정보를 표시하는 데 문제가 있습니다. 여기 내 BookshelfJS 모델 두 가지가 있습니다 :BookshelfJS hasOne 관계에 유효한 대상 모델을 정의해야합니다.

룸 :

var user = require(__base + '/app/database/models/user/user').model; 

exports.model = Application.Adapter.Model.extend({ 
    tableName: 'rooms', 
    hasTimestamps: false, 
    owner: function() { return this.hasOne(user, 'id', 'owner_id'); } 
}); 

사용자 :이 모델의

var user_badges  = require(__base + '/app/database/models/user/user_badges').model, 
    user_settings = require(__base + '/app/database/models/user/user_settings').model, 
    rooms   = require(__base + '/app/database/models/room/room').model, 
    groups   = require(__base + '/app/database/models/group/group').model; 

exports.model = Application.Adapter.Model.extend({ 
    tableName: 'users', 
    hasTimestamps: false, 
    badges: function() { return this.hasMany(user_badges, 'user_id', 'id'); }, 
    settings: function() { return this.hasMany(user_settings, 'user_id', 'id'); }, 
    rooms: function() { return this.hasMany(rooms, 'owner_id', 'id'); }, 
    groups: function() { return this.hasMany(groups, 'user_id', 'id'); } 
}); 

모두 다른 페이지에 서로 완전히 분리 사용

. 현재 프로필 페이지의 사용자 모델에있는 모든 관계를 사용하고 있으며 그 관계가 작동 중입니다. 소유자 정보와 함께 객실에 대한 모든 정보를 표시하는 다른 페이지가 있습니다. 내가 hasOne의 & belongsTo를 모두 사용하여 시도했지만 얻이 수없는 것

A valid target model must be defined for the rooms hasOne relation 

: 나는 지금까지 내가 받고있어 오류가

var room = require(__base + '/app/database/models/room/room').model; 

var room_id = 1; 

return new room({id: room_id}).fetch({ 
    withRelated: [ 
     {'owner': function(qb) { 
      qb.column('id','username'); 
     }} 
    ], 
    columns: ['id', 'owner_id', 'name'] 
}) 

.then(function resolve(result) 
{ 
    if(result == null) return Promise.reject(new Error('invalid_room')); 

    return Promise.resolve(result.toJSON()); 
}, 

function reject(err) 
{ 
    return Promise.reject(err); 
}); 

방 모델을 사용하고 있는데 어떻게 여기입니다 그것은 작동합니다, 누군가가 솔루션을 가지고 있다면 저에게 감사드립니다!

+0

[Registry Plugin] (https://github.com/tgriesser/bookshelf/wiki/Plugin:-Model-Registry)에서 살펴보십시오. 관계를 훨씬 쉽게 정의 할 수 있습니다. – flaviodesousa

답변

0

순환 참조가 불가피 할 때 (종종 그렇습니다) Registry Plugin은 더 간단한 설정을하는 데 도움이 될 수 있습니다. Application.Adapter은 책장의 인스턴스처럼 경우

가 보이는, 그래서 당신은 (Application.Adapter.plugin('registry')으로) 그것을 레지스트리 플러그인을 추가 할 경우 room 수업은 다음과 같은 모양입니다 :이 위의 예에서

// Take references from the registry instead of using `require` 
// Note: assuming 'user' was registered with registry plugin 
var user = Application.Adapter.model('user'); 

var room = Application.Adapter.Model.extend({ 
    tableName: 'rooms', 
    hasTimestamps: false, 
    // Note the use of 'user' instead of user 
    owner: function() { return this.hasOne('user', 'id', 'owner_id'); } 
}); 

// Model modules no longer needed to be exported, just registered 
Application.Adapter.model('room', room); 

user을 레지스트리에서 가져올 필요가 없습니다. 모델로 직접 사용되지 않았기 때문입니다. 그러나 나는 그것을 레지스트리에서 모델을 만드는 방법의 예로서 지켰다.