Class: SC.RelationshipSupport
Provides support for having relationships propagate by data provided by the data source.
This means the following interaction is now valid:
App = { store: SC.Store.create(SC.RelationshipSupport) };
App.Person = SC.Record.extend({
primaryKey: 'name',
name: SC.Record.attr(String),
power: SC.Record.toOne('App.Power', {
isMaster: NO,
inverse: 'person'
})
});
App.Power = SC.Record.extend({
person: SC.Record.toOne('App.Person', {
isMaster: YES,
inverse: 'power'
})
});
var zan = App.store.createRecord(App.Person, { name: 'Zan' }),
jayna = App.store.createRecord(App.Person, { name: 'Janya' });
// Wondertwins activate!
var glacier = App.store.loadRecords(App.Power, [{
guid: 'petunia', // Shape of...
person: 'Jayna'
}, {
guid: 'drizzle', // Form of...
person: 'Zan'
}]);
Leveraging this mixin requires your records to be unambiguously
defined. Note that this mixin does not take into account record
relationship created / destroyed on dataSourceDidComplete
,
writeAttribute
, etc. The only support here is for pushRetrieve
,
pushDestroy
, and loadRecords
(under the hood, loadRecord(s)
uses
pushRetrieve
).
This mixin also supports lazily creating records when a related record is pushed in from the store (but it doesn't exist).
This means that the previous example could have been simplified to this:
App.Power = SC.Record.extend({
person: SC.Record.toOne('App.Person', {
isMaster: YES,
lazilyInstantiate: YES,
inverse: 'power'
})
});
// Wondertwins activate!
var glacier = App.store.loadRecords(App.Power, [{
guid: 'petunia', // Shape of...
person: 'Jayna'
}, {
guid: 'drizzle', // Form of...
person: 'Zan'
}]);
When the loadRecords
call is done, there will be four unmaterialized
records in the store, giving the exact same result as the former
example.
As a side note, this mixin was developed primarily for use in a real-time backend that provides data to SproutCore as soon as it gets it (no transactions). This means streaming APIs / protocols like the Twitter streaming API or XMPP (an IM protocol) can be codified easier.
Defined in: relationship_support.js
- Since:
- SproutCore 1.6
Class Methods
- pushDestroy(original, recordType, id, storeKey)
- pushRetrieve(original, recordType, id, dataHash, storeKey, ignore)
Class Method Detail
Disassociate records that are related to the one being destroyed iff this
record has isMaster
set to YES
.
- Parameters:
- original
- recordType
- id
- storeKey
Associate records that are added via a pushRetrieve
, and update subsequent
relationships to ensure that the master-slave relationship is kept intact.
For use cases, see the test for pushRelationships
.
The ignore
argument is only set to true when adding the inverse
relationship (to prevent recursion).
- Parameters:
- original
- recordType
- id
- dataHash
- storeKey
- ignore