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
11155
(-- --)
November 18, 2011, 3:08pm
7
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.