Implement findOrCreate, requested in #190

This commit is contained in:
Anatoliy Chakkaev 2013-01-22 01:21:31 +07:00
parent 40b64cfc5e
commit 9dbc8fa50b
1 changed files with 29 additions and 1 deletions

View File

@ -258,6 +258,34 @@ AbstractClass.upsert = AbstractClass.updateOrCreate = function upsert(data, call
}
};
/**
* Find one record, same as `all`, limited by 1 and return object, not collection,
* if not found, create using data provided as second argument
*
* @param {Object} query - search conditions: {where: {test: 'me'}}.
* @param {Object} data - object to create.
* @param {Function} cb - callback called with (err, instance)
*/
AbstractClass.findOrCreate = function findOrCreate(query, data, callback) {
if (typeof query === 'undefined') {
query = {where: {}};
}
if (typeof data === 'function' || typeof data === 'undefined') {
callback = data;
data = query && query.where;
}
if (typeof callback === 'undefined') {
callback = function () {};
}
var t = this;
this.findOne(query, function (err, record) {
if (err) return callback(err);
if (record) return callback(null, record);
t.create(data, callback);
});
};
/**
* Check whether object exitst in database
*
@ -341,7 +369,7 @@ AbstractClass.all = function all(params, cb) {
/**
* Find one record, same as `all`, limited by 1 and return object, not collection
*
* @param {Object} params - search conditions
* @param {Object} params - search conditions: {where: {test: 'me'}}
* @param {Function} cb - callback called with (err, instance)
*/
AbstractClass.findOne = function findOne(params, cb) {