dubstep
November 16, 2011, 12:07am
1
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
On Nov 15, 11:06pm, John M. [email protected] wrote:
@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 => {:
On Nov 16, 1:46pm, John M. [email protected] wrote:
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 C. wrote in post #1032161:
On Nov 16, 1:46pm, John M. [email protected] wrote:
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.
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
On Nov 16, 3:14am, Frederick C. [email protected]