2017-02-24 67 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'); } 
}); 

这些车型无论是从不同的页面上彼此完全分开使用。我目前正在使用个人资料页面上的用户模型中的所有关系,并且这些关系正在工作。我有一个不同的页面,它将显示关于房间的所有信息以及所有者信息。下面是我如何使用房间模型到目前为止

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

这是我收到的错误:

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

我同时使用hasOne &属于关联尝试,但似乎无法得到它的工作,如果任何人有解决方案,请让我知道谢谢你!

+0

看看[注册表插件](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,因为它从来没有被直接用作模型。但我保留它作为如何从注册表中获取模型的示例。