2017-02-24 66 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,因爲它從來沒有被直接用作模型。但我保留它作爲如何從註冊表中獲取模型的示例。