You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

67 lines
1.6 KiB
CoffeeScript

Promise = require "bluebird"
_shallowClone = (obj) ->
newObject = {}
for key, value of obj
newObject[key] = value
return newObject
module.exports = class Record
constructor: ->
@_data = {}
@_savedData = {}
@_changedData = {}
_setModel: (model) ->
self = this
@_model = model
if model.options.columns?
model.options.columns.forEach (column) =>
Object.defineProperty this, column,
get: -> self.get column
set: (value) -> self.set column, value
_setData: (data) ->
# We might need a deep clone here?
@_data = _shallowClone(data)
@_savedData = _shallowClone(data)
_loadRelations: (relations, data) ->
Promise.map relations, (relation) =>
{key: relation, value: @_model.options.relations[relation]}
.reduce ((obj, relationData) =>
obj[relationData.key] = relationData.value
return obj
), {}
.then (relations) =>
@_model._getRelations(relations, data)
.then (relations) =>
for attribute, record of relations
this[attribute] = record
return this
_saveAttributes: (attributes) ->
null # do stuff
# Upon success...
@_savedData = @_data
@_changedData = {}
get: (attribute) ->
return @_data[attribute]
set: (attribute, value) ->
@_data[attribute] = value
@_changedData[attribute] = value
save: ->
# This only saves the changed attributes - it is almost always what you want.
@_saveAttributes(@_changedData)
saveAll: ->
# This saves *all* the attributes as they are currently set in the object - even if something else has changed them in the database in the meantime. You probably don't need this.
@_saveAttributes(@_data)