ruby-on-railsember.jsember-dataember-1

3-rd level serialization of embedded objects


ember, ember-data 1.0, rails, rabl

I have next json returning from server:


    {
     "day":{
       "id":5,   
       "expenditures":[{
           "id":10,
           "expense_type":{
             "name":"Very Sad",
             "id":2
           }
         }, 
         {...}
       ]
     }
    }

I have next ember models:


    Expense.Day = DS.Model.extend 
      expenditures: DS.hasMany('expenditure')

    Expense.Expenditure = DS.Model.extend 
      day: DS.belongsTo('day')
      expenseType: DS.belongsTo('expenseType')

    Expense.ExpenseType = DS.Model.extend 
      name: DS.attr('string')
      expenditures: DS.hasMany('expenditure')

And I use ActiveModelSerializer for each model with EmbeddedRecordsMixin, for ex:


    Expense.DaySerializer = Expense.ApplicationSerializer.extend DS.EmbeddedRecordsMixin,
      attrs:
        expenditures: {embedded: 'always'}

    Expense.ExpenditureSerializer = Expense.ApplicationSerializer.extend DS.EmbeddedRecordsMixin,
      attrs:
        expenseType: {embedded: 'always'}
        day: {embedded: 'always'}

    Expense.ExpenseTypeSerializer = Expense.ApplicationSerializer.extend DS.EmbeddedRecordsMixin,
      attrs:
        expenditures: {embedded: 'always'}

It propertly loads day and expenditures, but not expense_type. I inject into each serializer merhod extract with console.log and super() for debugging and see, that only DaySerializer executed. What's wrong with me? I am very close to insanity with Ember =(


Solution

  • The problem is for my ember data understanding. I look into the EmbeddedRecordsMixin source code and see, that only hasMany ralation can be embedded.

    Just adding expense_type_id node to expenditure item solves the problem:

    {
     "day":{
       "id":5,   
       "expenditures":[{
           "id":10,
           "expense_type_id": 2
         }, 
         {...}
       ]
     }
    }
    

    Ember process GET request for /expense_types/2 and load model. Thats all!