2017-02-24 16 views
0

ソーシャルネットワーキングサイト用のプロファイルシステムを作成しています。私は関係を使用して、異なるテーブルのユーザーに関するさまざまな情報を表示するのに問題があります。ここに私のBookshelfJSモデルの2つです: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を取得する必要はありませんでした。これは、モデルとして直接使用されたことがないためです。しかし、私はレジストリからモデルを取る方法の例としてそれを保管しました。

関連する問題