From 46f7e6bba02df89f5f0f4dfb706e8b08bb0693a2 Mon Sep 17 00:00:00 2001 From: Piotr Sarnacki Date: Tue, 26 Feb 2013 04:37:23 +0100 Subject: [PATCH] Fix remaining ember-data and pusher updates issues When records are updated by pusher events, we should not mark them as dirty - we don't modify them on client side anyway. --- assets/scripts/app/store.coffee | 1 - assets/scripts/app/store/rest_adapter.coffee | 19 +++++++++++++++--- .../scripts/spec/unit/incomplete_spec.coffee | 20 ++++++++++++++++++- 3 files changed, 35 insertions(+), 5 deletions(-) diff --git a/assets/scripts/app/store.coffee b/assets/scripts/app/store.coffee index e26cfd63..db0abeb3 100644 --- a/assets/scripts/app/store.coffee +++ b/assets/scripts/app/store.coffee @@ -52,7 +52,6 @@ Travis.Store = DS.Store.extend !!@typeMapFor(type).idToCid[id] receive: (event, data) -> - #console.log event, data [name, type] = event.split(':') mappings = @adapter.get('mappings') diff --git a/assets/scripts/app/store/rest_adapter.coffee b/assets/scripts/app/store/rest_adapter.coffee index eb422316..848c05e9 100644 --- a/assets/scripts/app/store/rest_adapter.coffee +++ b/assets/scripts/app/store/rest_adapter.coffee @@ -7,6 +7,22 @@ DS.JSONTransforms['object'] = { } Travis.Serializer = DS.RESTSerializer.extend + # The next 3 methods specify the behavior of adding records to dirty sets + # (ie. which records will be treated as dirty on the next commit). We don't + # allow to change most of the records on the client, so for anything except + # the User, we ignore dirtyiness. + dirtyRecordsForAttributeChange: (dirtySet, record) -> + if record.constructor == Travis.User + @_super.apply this, arguments + + dirtyRecordsForBelongsToChange: (dirtySet, record) -> + if record.constructor == Travis.User + @_super.apply this, arguments + + dirtyRecordsForHasManyChange: (dirtySet, record) -> + if record.constructor == Travis.User + @_super.apply this, arguments + merge: (record, serialized) -> data = record.get('data') @@ -42,9 +58,6 @@ Travis.Serializer = DS.RESTSerializer.extend record.notifyPropertyChange(name) , this) - # TODO: add test that ensures that this line is called - # it should check if record goes into loaded.saved - # state after being in materializing record.notifyPropertyChange('data') Travis.RestAdapter = DS.RESTAdapter.extend diff --git a/assets/scripts/spec/unit/incomplete_spec.coffee b/assets/scripts/spec/unit/incomplete_spec.coffee index 9957e587..fdbcdfce 100644 --- a/assets/scripts/spec/unit/incomplete_spec.coffee +++ b/assets/scripts/spec/unit/incomplete_spec.coffee @@ -18,7 +18,9 @@ describe 'Travis.Model - incomplete', -> niceBar: DS.belongsTo('Travis.Bar') veryNiceBar: DS.belongsTo('Travis.Bar') - Travis.Bar = Travis.Model.extend() + Travis.Bar = Travis.Model.extend + name: DS.attr('string') + foos: DS.hasMany('Travis.Foo') adapterClass = Travis.RestAdapter.extend() adapterClass.map 'Travis.Foo', @@ -33,6 +35,22 @@ describe 'Travis.Model - incomplete', -> delete Travis.Bar store.destroy() + it 'allows to merge many times', -> + store.load(Travis.Bar, { id: '1', foo_ids: ['1', '2'] }, { id: '1' }) + store.load(Travis.Foo, { id: '1', bar_id: '1' }, { id: '1' }) + store.load(Travis.Foo, { id: '2', bar_id: '1' }, { id: '2' }) + + record = store.find(Travis.Bar, 1) + store.find(Travis.Foo, 1) + store.find(Travis.Foo, 2) + + record.get('foos') + store.loadIncomplete(Travis.Bar, id: 1, name: 'foo') + store.loadIncomplete(Travis.Bar, id: 1, name: 'bar') + + expect( record.get('foos.length') ).toEqual(2) + expect( record.get('name') ).toEqual('bar') + describe 'with incomplete record with loaded associations', -> beforeEach -> attrs = {