Add support for nesting objects with an array
This commit is contained in:
parent
4cd9ea49ec
commit
8e01e17bdb
|
@ -18,8 +18,11 @@ var User = modelBuilder.define('User', {
|
||||||
emails: [{
|
emails: [{
|
||||||
label: String,
|
label: String,
|
||||||
email: String
|
email: String
|
||||||
}]
|
}],
|
||||||
|
friends: [String]
|
||||||
});
|
});
|
||||||
|
|
||||||
var user = new User({name: 'Joe', age: 20, address: {street: '123 Main St', 'city': 'San Jose', state: 'CA'}, emails: [{label: 'work', email: 'xyz@sample.com'}]});
|
var user = new User({name: 'Joe', age: 20, address: {street: '123 Main St', 'city': 'San Jose', state: 'CA'},
|
||||||
|
emails: [{label: 'work', email: 'xyz@sample.com'}],
|
||||||
|
friends: ['John', 'Mary']});
|
||||||
console.log(user.toObject());
|
console.log(user.toObject());
|
||||||
|
|
19
lib/list.js
19
lib/list.js
|
@ -46,7 +46,7 @@ function List(data, type, parent) {
|
||||||
}
|
}
|
||||||
|
|
||||||
data.forEach(function(item, i) {
|
data.forEach(function(item, i) {
|
||||||
data[i] = new Item(item, list);
|
data[i] = Item(item, list);
|
||||||
Object.defineProperty(list, data[i].id, {
|
Object.defineProperty(list, data[i].id, {
|
||||||
writable: true,
|
writable: true,
|
||||||
enumerable: false,
|
enumerable: false,
|
||||||
|
@ -147,12 +147,20 @@ List.prototype.find = function(pattern, field) {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
List.prototype.toObject = function() {
|
List.prototype.toObject = function(onlySchema) {
|
||||||
return this.items;
|
var items = [];
|
||||||
|
this.items.forEach(function(item) {
|
||||||
|
if(item.toObject) {
|
||||||
|
items.push(item.toObject(onlySchema));
|
||||||
|
} else {
|
||||||
|
items.push(item);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
return items;
|
||||||
};
|
};
|
||||||
|
|
||||||
List.prototype.toJSON = function() {
|
List.prototype.toJSON = function() {
|
||||||
return this.items;
|
return this.toObject(true);
|
||||||
};
|
};
|
||||||
|
|
||||||
List.prototype.toString = function() {
|
List.prototype.toString = function() {
|
||||||
|
@ -199,6 +207,9 @@ List.prototype.map = function(cb) {
|
||||||
};
|
};
|
||||||
|
|
||||||
function ListItem(data, parent) {
|
function ListItem(data, parent) {
|
||||||
|
if(!(this instanceof ListItem)) {
|
||||||
|
return new ListItem(data, parent);
|
||||||
|
}
|
||||||
if (typeof data === 'object') {
|
if (typeof data === 'object') {
|
||||||
for (var i in data) this[i] = data[i];
|
for (var i in data) this[i] = data[i];
|
||||||
} else {
|
} else {
|
||||||
|
|
|
@ -172,9 +172,13 @@ ModelBaseClass.prototype.toObject = function (onlySchema) {
|
||||||
|
|
||||||
this.constructor.forEachProperty(function (attr) {
|
this.constructor.forEachProperty(function (attr) {
|
||||||
if (self[attr] instanceof List) {
|
if (self[attr] instanceof List) {
|
||||||
data[attr] = self[attr].toObject();
|
data[attr] = self[attr].toObject(onlySchema);
|
||||||
} else if (self.__data.hasOwnProperty(attr)) {
|
} else if (self.__data.hasOwnProperty(attr)) {
|
||||||
data[attr] = self[attr];
|
if(self[attr] !== undefined && self[attr]!== null && self[attr].toObject) {
|
||||||
|
data[attr] = self[attr].toObject(onlySchema);
|
||||||
|
} else {
|
||||||
|
data[attr] = self[attr];
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
data[attr] = null;
|
data[attr] = null;
|
||||||
}
|
}
|
||||||
|
|
|
@ -135,7 +135,7 @@ describe('DataSource define model', function () {
|
||||||
};
|
};
|
||||||
|
|
||||||
var user = new User({name: 'Joe'});
|
var user = new User({name: 'Joe'});
|
||||||
console.log(user);
|
// console.log(user);
|
||||||
|
|
||||||
// setup relationships
|
// setup relationships
|
||||||
User.hasMany(Post, {as: 'posts', foreignKey: 'userId'});
|
User.hasMany(Post, {as: 'posts', foreignKey: 'userId'});
|
||||||
|
@ -146,15 +146,15 @@ describe('DataSource define model', function () {
|
||||||
|
|
||||||
var user2 = new User({name: 'Smith'});
|
var user2 = new User({name: 'Smith'});
|
||||||
user2.save(function (err) {
|
user2.save(function (err) {
|
||||||
console.log(user2);
|
// console.log(user2);
|
||||||
var post = user2.posts.build({title: 'Hello world'});
|
var post = user2.posts.build({title: 'Hello world'});
|
||||||
post.save(function (err, data) {
|
post.save(function (err, data) {
|
||||||
console.log(err ? err : data);
|
// console.log(err ? err : data);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
Post.findOne({where: {published: false}, order: 'date DESC'}, function (err, data) {
|
Post.findOne({where: {published: false}, order: 'date DESC'}, function (err, data) {
|
||||||
console.log(data);
|
// console.log(data);
|
||||||
});
|
});
|
||||||
|
|
||||||
User.create({name: 'Jeff'}, function (err, data) {
|
User.create({name: 'Jeff'}, function (err, data) {
|
||||||
|
@ -162,13 +162,13 @@ describe('DataSource define model', function () {
|
||||||
console.log(err);
|
console.log(err);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
console.log(data);
|
// console.log(data);
|
||||||
var post = data.posts.build({title: 'My Post'});
|
var post = data.posts.build({title: 'My Post'});
|
||||||
console.log(post);
|
// console.log(post);
|
||||||
});
|
});
|
||||||
|
|
||||||
User.create({name: 'Ray'}, function (err, data) {
|
User.create({name: 'Ray'}, function (err, data) {
|
||||||
console.log(data);
|
// console.log(data);
|
||||||
});
|
});
|
||||||
|
|
||||||
var Article = ds.define('Article', {title: String});
|
var Article = ds.define('Article', {title: String});
|
||||||
|
@ -179,7 +179,7 @@ describe('DataSource define model', function () {
|
||||||
article.tags.create({name: 'popular'}, function (err, data) {
|
article.tags.create({name: 'popular'}, function (err, data) {
|
||||||
Article.findOne(function (e, article) {
|
Article.findOne(function (e, article) {
|
||||||
article.tags(function (e, tags) {
|
article.tags(function (e, tags) {
|
||||||
console.log(tags);
|
// console.log(tags);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
@ -249,7 +249,7 @@ describe('Load models from json', function () {
|
||||||
models.should.have.property('Customer');
|
models.should.have.property('Customer');
|
||||||
for (var s in models) {
|
for (var s in models) {
|
||||||
var m = models[s];
|
var m = models[s];
|
||||||
console.log(m.modelName, new m());
|
// console.log(m.modelName, new m());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
|
@ -196,7 +196,7 @@ describe('relations', function() {
|
||||||
Article.create(function(e, article) {
|
Article.create(function(e, article) {
|
||||||
article.tags.create({name: 'popular'}, function(e, t) {
|
article.tags.create({name: 'popular'}, function(e, t) {
|
||||||
t.should.be.an.instanceOf(Tag);
|
t.should.be.an.instanceOf(Tag);
|
||||||
console.log(t);
|
// console.log(t);
|
||||||
ArticleTag.findOne(function(e, at) {
|
ArticleTag.findOne(function(e, at) {
|
||||||
should.exist(at);
|
should.exist(at);
|
||||||
at.tagId.toString().should.equal(t.id.toString());
|
at.tagId.toString().should.equal(t.id.toString());
|
||||||
|
|
Loading…
Reference in New Issue