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:

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.

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.