Sails在两个模型中插入相同的对象

时间:2015-05-15 18:59:35

标签: node.js mongodb sails.js

是否可以在两个模型中插入两个对象? 我创建了两个模型Playlist和Song,我创建了一个song1和两个播放列表:playlist1和playlist2;我希望播放列表1有song1和播放列表2有相同的歌曲(song1)。

但是当我将playlist1中的song1关联起来并且我将播放列表2中的song1关联起来时,playlist1中的关系就会消失。 关系是1到N,我尝试使用N到N的关系,但我无法解决它。

有人可以帮帮我吗? :(

抱歉,我的问题是在控制器中我有主模型并使用两种模型。

主要型号:

--- Playlist.js ---

module.exports = {
  attributes: {
     name: {
        type: 'string',
        required: true,
        unique: true
     },
     // Associations
     tablets_playlists: { 
       collection: 'Tablet',
       via: 'lista_tablet'
     },

     songs_playlist: { 
      collection: 'Song',
      via: 'song'
     }
   }
};

其他型号:

--- Song.js ---

module.exports = {
  attributes: {
     group: {
        type: 'string',
        required: true,
        unique: true
     },
     song: {
        type: 'string'
     },

     // Association
     song: { 
       collection: 'Playlist',
       via: 'songs_playlist'
     }
   }
};

--- Tablet.js ---
module.exports = {
  attributes: {
     MAC: {
        type: 'string',
        required: true,
        unique: true
     },
     // Associations
     lista_tablet: { 
       collection: 'Playlist',
       via: 'tablets_playlists'
     }
};

当我在渲染视图中将一首歌曲与播放列表或平板电脑与播放列表相关联时,不会出现。但如果关系是1到N,则会出现。当我将同一首歌关联两次,服务器崩溃时,我认为这是因为有或者它正在尝试在bbdd中添加两个等于对象。

这是我将平板电脑与播放列表相关联的方法,类似于歌曲(我之前发布过)。

associateTabletToPlaylist: function(req,res,next){
    var tablet_id = req.param('tablet_id');
    var playlist_id = req.param('playlist_id');

    Playlist.findOne(playlist_id, function foundPlaylist(err, playlist) {
        if (err) return next(err);
        if (!playlist) return next();

        playlist.tablets_playlists.add(tablet_id);
        playlist.save(function createAssociation(err, saved) {

            if (err) res.redirect('/playlist/associateTablet/');
            res.redirect('/playlist/show/' + playlist_id);
        });
    });
}

这是PlaylistController中要显示的代码,用于渲染视图:

// render the profile view (e.g. /playlist/show/.ejs)
show: function(req, res, next) {

    Playlist.findOne(req.param('id'), function foundPlaylist(err, playlist) {
        if (err) return next(err);
        if (!playlist) return next();
        Tablet.find({'listas_reproduccion':playlist.id},function foundTablets(err, tablets) {
            if (err) return next(err);
            if (!tablets) return next();
            Song.find({'song':playlist.id}, function foundSongs(err, songs) {
                if (err) return next(err);
                if (!songs) return next();
                res.view({
                    songs: songs,
                    tablets: tablets,
                    playlist: playlist
                });
            });
        });
    });
},

1 个答案:

答案 0 :(得分:2)

看起来你有一对一的关系,但你需要多对多。

歌曲有很多播放列表,播放列表有很多歌曲。您必须通过属性提供:

歌曲模型:

module.exports = {

    attributes: {
        name:'STRING',

        // Add a reference to Playlists
        playlists: {
            collection: 'playlists',
            via: 'songs'
        }
    }
}

播放列表模型:

module.exports = {

    attributes: {
        name:'STRING',

        // Add a reference to Songs
        songs: {
            collection: 'songs',
            via: 'playlists'
        }
    }
}