不要怂,就是干,撸起袖子干!

Commit 17128deb by Sascha Depold

better "scoping" for options attribute

1 parent dc1c1820
Showing with 32 additions and 33 deletions
var Utils = require("./utils")
, Mixin = require("./associations/mixin")
, QueryGenerator = require("./query-generator")
var Model = module.exports = function(values, options) {
var self = this
this.definition = null // will be set in Model.build
this.attributes = []
this.options = options || {}
this.__options = options || {}
// add all passed values to the model and store the attribute names in this.attributes
Utils._.map(values, function(value, key) { self.addAttribute(key, value) })
// set id to null if not passed as value
// a newly created model has no id
var defaults = this.options.hasPrimaryKeys ? {} : { id: null }
var defaults = this.__options.hasPrimaryKeys ? {} : { id: null }
if(this.options.timestamps) {
defaults[this.options.underscored ? 'created_at' : 'createdAt'] = new Date()
defaults[this.options.underscored ? 'updated_at' : 'updatedAt'] = new Date()
if(this.__options.timestamps) {
defaults[this.__options.underscored ? 'created_at' : 'createdAt'] = new Date()
defaults[this.__options.underscored ? 'updated_at' : 'updatedAt'] = new Date()
if(this.options.paranoid)
defaults[this.options.underscored ? 'deleted_at' : 'deletedAt'] = null
if(this.__options.paranoid)
defaults[this.__options.underscored ? 'deleted_at' : 'deletedAt'] = null
}
Utils._.map(defaults, function(value, attr) {
......@@ -46,17 +46,17 @@ Model.prototype.addAttribute = function(attribute, value) {
Model.prototype.query = function() {
var args = Utils._.map(arguments, function(arg, _) { return arg })
, s = this.definition.modelManager.sequelize
args.push(this)
return s.query.apply(s, args)
}
Model.prototype.save = function() {
var attr = this.options.underscored ? 'updated_at' : 'updatedAt'
var attr = this.__options.underscored ? 'updated_at' : 'updatedAt'
if(this.hasOwnProperty(attr))
this[attr] = new Date()
if(this.isNewRecord) {
var self = this
var eventEmitter = new Utils.CustomEventEmitter(function() {
......@@ -69,7 +69,7 @@ Model.prototype.save = function() {
})
return eventEmitter.run()
} else {
var identifier = this.options.hasPrimaryKeys ? this.primaryKeyValues : this.id
var identifier = this.__options.hasPrimaryKeys ? this.primaryKeyValues : this.id
return this.query(QueryGenerator.updateQuery(this.definition.tableName, this.values, identifier))
}
}
......@@ -95,11 +95,11 @@ Model.prototype.updateAttributes = function(updates) {
}
Model.prototype.destroy = function() {
if(this.options.timestamps && this.options.paranoid) {
this[this.options.underscored ? 'deleted_at' : 'deletedAt'] = new Date()
if(this.__options.timestamps && this.__options.paranoid) {
this[this.__options.underscored ? 'deleted_at' : 'deletedAt'] = new Date()
return this.save()
} else {
var identifier = this.options.hasPrimaryKeys ? this.primaryKeyValues : this.id
var identifier = this.__options.hasPrimaryKeys ? this.primaryKeyValues : this.id
return this.query(QueryGenerator.deleteQuery(this.definition.tableName, identifier))
}
}
......@@ -108,43 +108,43 @@ Model.prototype.__defineGetter__("identifiers", function() {
var primaryKeys = Utils._.keys(this.definition.primaryKeys)
, result = {}
, self = this
if(!this.definition.hasPrimaryKeys)
primaryKeys = ['id']
primaryKeys.forEach(function(identifier) {
result[identifier] = self[identifier]
})
return result
})
Model.prototype.__defineGetter__('isDeleted', function() {
var result = this.options.timestamps && this.options.paranoid
result = result && this[this.options.underscored ? 'deleted_at' : 'deletedAt'] != null
var result = this.__options.timestamps && this.__options.paranoid
result = result && this[this.__options.underscored ? 'deleted_at' : 'deletedAt'] != null
return result
})
Model.prototype.__defineGetter__('values', function() {
var result = {}
, self = this
this.attributes.forEach(function(attr) {
result[attr] = self[attr]
})
return result
})
Model.prototype.__defineGetter__('primaryKeyValues', function() {
var result = {}
, self = this
Utils._.each(this.definition.primaryKeys, function(_, attr) {
result[attr] = self[attr]
})
return result
})
......@@ -155,18 +155,18 @@ Model.prototype.equals = function(other) {
Utils._.each(this.values, function(value, key) {
result = result && (value == other[key])
})
return result
}
Model.prototype.equalsOneOf = function(others) {
var result = false
, self = this
others.forEach(function(other) { result = result || self.equals(other) })
return result
}
/* Add the instance methods to Model */
Utils._.map(Mixin.instanceMethods, function(fct, name) { Model.prototype[name] = fct})
\ No newline at end of file
Utils._.map(Mixin.instanceMethods, function(fct, name) { Model.prototype[name] = fct})
Markdown is supported
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!