Fix id references

This commit is contained in:
Raymond Feng 2013-07-24 22:51:25 -07:00
parent 5bf2d1ff23
commit 96787ad25f
1 changed files with 16 additions and 6 deletions

View File

@ -85,7 +85,7 @@ DataAccessObject.create = function (data, callback) {
data = {};
}
if (data instanceof Array) {
if (Array.isArray(data)) {
var instances = [];
var errors = Array(data.length);
var gotError = false;
@ -117,7 +117,7 @@ DataAccessObject.create = function (data, callback) {
var obj;
// if we come from save
if (data instanceof Model && !data.id) {
if (data instanceof Model && !getIdValue(this, data)) {
obj = data;
} else {
obj = new Model(data);
@ -182,6 +182,16 @@ function stillConnecting(dataSource, obj, args) {
return true;
};
function getIdValue(m, data) {
return data && data[m.dataSource.idName(m.modelName)];
}
function setIdValue(m, data, value) {
if(data) {
data[m.dataSource.idName(m.modelName)] = value;
}
}
/**
* Update or insert
*/
@ -189,7 +199,7 @@ DataAccessObject.upsert = DataAccessObject.updateOrCreate = function upsert(data
if (stillConnecting(this.dataSource, this, arguments)) return;
var Model = this;
if (!data.id) return this.create(data, callback);
if (!getIdValue(this, data)) return this.create(data, callback);
if (this.dataSource.connector.updateOrCreate) {
var inst = new Model(data);
this.dataSource.connector.updateOrCreate(Model.modelName, inst.toObject(true), function (err, data) {
@ -203,7 +213,7 @@ DataAccessObject.upsert = DataAccessObject.updateOrCreate = function upsert(data
callback(err, obj);
});
} else {
this.findById(data.id, function (err, inst) {
this.findById(getIdValue(this, data), function (err, inst) {
if (err) return callback(err);
if (inst) {
inst.updateAttributes(data, callback);
@ -276,8 +286,8 @@ DataAccessObject.findById = function find(id, cb) {
this.dataSource.connector.find(this.modelName, id, function (err, data) {
var obj = null;
if (data) {
if (!data.id) {
data.id = id;
if (!getIdValue(this, data)) {
setIdValue(this, data, id);
}
obj = new this();
obj._initProperties(data, false);