undefined method `macro' for nil:NilClass

this error usually occurs when trying to mix 1st and 2nd order relationships in a single to_json call:

undefined method `macro' for nil:NilClass

Rails 3 has this way to support 2nd order relationships:

http://apidock.com/rails/ActiveRecord/Serialization/to_json

So I try to use it:

        @units = User.where(:id => params[:user_id]).first.units.to_json(:include => {         :only => :reports,         :notifications => {:include => {:only => :notification_codes} }         })

A unit has many reports and notifications. And a notification belongs to notification code.

This is the relationship between notifications and notification codes:

//notifications   belongs_to :notification_code, :foreign_key => :code

//notification codes   has_many :notifications

So I am not sure why error occurs.

Thanks for response

Hi!

The call to to_json shouldn’t be the last call in the statement?

Regards,

Everaldo

It was working fine until I added the 2nd order relationship. The documentation isnt clear about how to add the 2nd order relationship

this error usually occurs when trying to mix 1st and 2nd order relationships in a single to_json call:

undefined method `macro' for nil:NilClass

Rails 3 has this way to support 2nd order relationships:

to_json (ActiveRecord::Serialization) - APIdock

So I try to use it:

    @units = User\.where\(:id =>

params[:user_id]).first.units.to_json(:include => { :only => :reports, :notifications => {:include => {:only => :notification_codes} } })

A unit has many reports and notifications. And a notification belongs to notification code.

There is an example of second order include & only on the page you link to. You're using :only to refer to association names whereas only is supposed to denote which attributes you want to show for a given object so i think you are confusing to_json. something like :include => {:reports, :notifications => :notification_codes} should do the trick.

Fred

:include => {:notifications, :only => :reports, :include => {:

thanks for response

THis here would produce syntax error:

:include => {:reports, :notifications => :notification_codes}

So I try this (to ensure :reports has a value):

{:include => {:reports => {}, :notifications => :notification_codes}}

And this is ultimately what it would look like:

User.where(:id => params[:user_id]).first.units.to_json({:include => {:reports => {}, :notifications => :notification_codes}})

But this will say:

can't convert Symbol into Hash

thanks for response

THis here would produce syntax error:

:include => {:reports, :notifications => :notification_codes}

oops, that should have been [:reports, {:notifications => :notification_codes}]

also, if notification belongs_to :notification code, then it should be

[:reports, {:notifications => :notification_code}]

i.e. the symbols in that hash should exactly match the name given to the has_many, belongs_to etc.

Fred

Frederick Cheung wrote in post #1032161:

thanks for response

THis here would produce syntax error:

:include => {:reports, :notifications => :notification_codes}

oops, that should have been [:reports, {:notifications => :notification_codes}]

also, if notification belongs_to :notification code, then it should be

[:reports, {:notifications => :notification_code}]

i.e. the symbols in that hash should exactly match the name given to the has_many, belongs_to etc.

Fred

thanks for response,

this is what ultimately worked for me:

Unit.where(:id => params[:unit_id]).first.reports.to_json(:include => { :notifications => {                                          :include => { :notification_code => {                                                        :only => :name } }                                                       } }) As you mentioned, this would only include the "name" attribute of notification code, but anything else I tried was still giving the "macro" error.