travis-web/assets/scripts/lib/travis/model.coffee
Piotr Sarnacki 300ad58516 Fix incomplete implementation
While testing in the wild I spotted a few problems with it:

* it didn't work for camel case names.
* it was sometimes setting loaded data too late - it needed to use find
  and then save data on the record. Instead it should save data in
  special array saved on store, indexed by clientId
* there is already method to get attributes in ember-data, it just
  doesn't work with Travis.Foo.get('attributes'), it needs
  Ember.get(Travis.Foo, 'attributes') - it makes implementation much
  shorter
2012-10-22 02:54:48 +02:00

86 lines
2.1 KiB
CoffeeScript

@Travis.Model = DS.Model.extend
primaryKey: 'id'
id: DS.attr('number')
init: ->
@loadedAttributes = []
@_super.apply this, arguments
get: (name) ->
if @constructor.isAttribute(name) && @get('incomplete') && !@isAttributeLoaded(name)
@loadTheRest()
@_super.apply this, arguments
refresh: ->
if id = @get('id')
store = @get('store')
store.adapter.find store, @constructor, id
update: (attrs) ->
$.each attrs, (key, value) =>
@set(key, value) unless key is 'id'
this
isAttributeLoaded: (name) ->
if meta = Ember.get(this.constructor, 'attributes').get(name)
name = meta.key(this.constructor)
@get('store').isDataLoadedFor(this.constructor, @get('clientId'), name)
isComplete: (->
if @get 'incomplete'
@loadTheRest()
false
else
@set 'isCompleting', false
@get 'isLoaded'
).property('incomplete', 'isLoaded')
loadTheRest: ->
return if @get('isCompleting')
@set 'isCompleting', true
@refresh()
select: ->
@constructor.select(@get('id'))
loadedAsIncomplete: () ->
@set 'incomplete', true
@Travis.Model.reopenClass
find: ->
if arguments.length == 0
Travis.app.store.findAll(this)
else
@_super.apply(this, arguments)
filter: (callback) ->
Travis.app.store.filter(this, callback)
load: (attrs) ->
Travis.app.store.load(this, attrs)
select: (id) ->
@find().forEach (record) ->
record.set('selected', record.get('id') == id)
buildURL: (suffix) ->
base = @url || @pluralName()
Ember.assert('Base URL (' + base + ') must not start with slash', !base || base.toString().charAt(0) != '/')
Ember.assert('URL suffix (' + suffix + ') must not start with slash', !suffix || suffix.toString().charAt(0) != '/')
url = [base]
url.push(suffix) if (suffix != undefined)
url.join('/')
singularName: ->
parts = @toString().split('.')
name = parts[parts.length - 1]
name.replace(/([A-Z])/g, '_$1').toLowerCase().slice(1)
pluralName: ->
Travis.app.store.adapter.pluralize(@singularName())
isAttribute: (name) ->
Ember.get(this, 'attributes').has(name)