From 8199767a8a8c5352409f7d2fa41e64964a73d6aa Mon Sep 17 00:00:00 2001 From: Fabien Franzen Date: Sat, 21 Mar 2015 13:44:06 +0100 Subject: [PATCH] Implement scope.findOne --- lib/scope.js | 20 +++++++++++++++++--- test/scope.test.js | 16 ++++++++++++++++ 2 files changed, 33 insertions(+), 3 deletions(-) diff --git a/lib/scope.js b/lib/scope.js index b7f879ff..a4e17f74 100644 --- a/lib/scope.js +++ b/lib/scope.js @@ -190,6 +190,7 @@ function defineScope(cls, targetClass, name, params, methods, options) { f.create = create; f.destroyAll = destroyAll; f.findById = findById; + f.findOne = findOne; f.count = count; for (var i in definition.methods) { f[i] = definition.methods[i].bind(self); @@ -245,6 +246,13 @@ function defineScope(cls, targetClass, name, params, methods, options) { cls['__findById__' + name] = fn_findById; + var fn_findOne = function (cb) { + var f = this[name].findOne; + f.apply(this[name], arguments); + }; + + cls['__findOne__' + name] = fn_findOne; + var fn_count = function (cb) { var f = this[name].count; f.apply(this[name], arguments); @@ -287,10 +295,16 @@ function defineScope(cls, targetClass, name, params, methods, options) { function findById(id, cb) { var targetModel = definition.targetModel(this._receiver); var idName = targetModel.definition.idName(); - var where = {}; - where[idName] = id; + var filter = { where: {} }; + filter.where[idName] = id; + this.findOne(filter, cb); + } + + function findOne(filter, cb) { + if (typeof filter === 'function') cb = filter, filter = {}; + var targetModel = definition.targetModel(this._receiver); var scoped = (this._scope && this._scope.where) || {}; - var filter = mergeQuery({ where: scoped }, { where: where }); + var filter = mergeQuery({ where: scoped }, filter || {}); targetModel.findOne(filter, cb); } diff --git a/test/scope.test.js b/test/scope.test.js index c7ac2ee1..b48c838b 100644 --- a/test/scope.test.js +++ b/test/scope.test.js @@ -182,6 +182,22 @@ describe('scope - filtered count and destroyAll', function () { }); }); + it('should find one', function(done) { + Station.active.findOne(function(err, station) { + should.not.exist(err); + station.name.should.equal('a'); + done(); + }); + }); + + it('should find one - with filter', function(done) { + Station.active.findOne({ where: { name: 'c' } }, function(err, station) { + should.not.exist(err); + station.name.should.equal('c'); + done(); + }); + }); + it('should find by id - match', function(done) { Station.active.findById(stationA.id, function(err, station) { should.not.exist(err);