Bert & Ernie Ember Data "wtf?" Example

by Nick Iaconis

HTML

<script src="http://builds.emberjs.com/handlebars-1.0.0.js"></script>
<script src="http://builds.emberjs.com/release/ember.js"></script>
<script src="http://builds.emberjs.com/canary/ember-data.js"></script>
<script type="text/x-handlebars" data-template-name="application">
    <dl>
        {{#each onething in App.oneThings}}
        <dt>{{onething.name}}</dt>
        {{#each manything in onething.manyThings}}
        <dd>{{manything.name}}</dd>
        {{/each}}
        {{/each}}
    </dl>
</script>

JavaScript

App = Ember.Application.create();

App.FixtureAdapter = DS.FixtureAdapter.extend();

App.Store = DS.Store.extend({
    adapter: 'fixture'
});

App.OneThing = DS.Model.extend({
  name: DS.attr('string'),
    manyThings: DS.hasMany('manyThing', { async: true })
});

App.ManyThing = DS.Model.extend({
  name: DS.attr('string'),
  oneThing: DS.belongsTo('oneThing')
});

App.OneThing.FIXTURES = [{
  id: 1,
  name: "Bert",
  manyThings: [1, 2, 3]
}, {
  id: 2,
  name: "Ernie",
  manyThings: [4, 5]
}];

App.ManyThing.FIXTURES = [{
  id: 1,
  name: "coffee",
  oneThing: 1
}, {
    id: 2,
    name: "newspaper",
    oneThing: 1
}, {
    id: 3,
    name: "seriousness",
    oneThing: 1
}, {
    id: 4,
    name: "rubber duckie",
    oneThing: 2
}, {
  id: 5,
  name: "imagination",
  oneThing: 2
}];

App.reopen({
    ready: function() {
        var store = App.__container__.lookup('store:main');
        App.set('oneThings', store.find('oneThing'));
        Ember.run.later(this, function() {
            App.get('oneThings').objectAt(0).save();
            Ember.debug('saved');
            var store = App.__container__.lookup('store:main'),
                newRecord = store.createRecord('manyThing', {
                name: "his friend, Bert",
                oneThing: App.get('oneThings').objectAt(1)
            });
            newRecord.save();
            Ember.debug('new record');
            
            Ember.run.later(this, function() {
                var ernie = App.get('oneThings').objectAt(1),
                    erniesManyThings = ernie.get('manyThings')
                erniesManyThings.pushObject(newRecord); // push from closure
                Ember.debug('manually pushed');
            }, 2000);
        }, 2000);
        return this._super.apply(this, arguments);
    }
});

DS.JSONSerializer.reopen({
    serializeHasMany : function(record, json, relationship) {
        var key = relationship.key;

        var relationshipType =...