Title: Nested serialization with to_json and to_xml with array and hash element
class Person < ActiveRecord::Base has_one :address has_one :job
def office() return "Executive_Suite" end end
class Address < ActiveRecord::Base belongs_to :person end
class Job < ActiveRecord::Base belongs_to :person has_one :paygrade
def Title return "Engineer" end end
class PayGrade < ActiveRecord::Base belongs_to: job
end
Given an instance of a Person, I am able to serialize in XML and JSON in some simpler nested manners such as this:
@person = Person.find_by_id(1)
# render the results with multiple peer associations with no drill down respond_to do |format| format.json { render.json(:json=>@person.to_json(:include=> [:address, :job], :methods=>:office) } format.xml { render.json(:json=>@person.to_json(:include=> [:address, :job], :methods=>:office) } } end
# render the results with 1 association requiring deep drill down respond_to do |format| format.json { render.json(:json=>@person.to_json(:include=> {:job=>{:include=>:paygrade}}) } format.xml { render.json(:json=>@person.to_json(:include=>{:job=> {:include=>:paygrade}}) } } end
Where I continually run into problems is where I have multiple peer associations at the same level with one of them needing further drill down into one of its association.
For instance I thought I could simply do this to serialize the Person instance, along with their address, job with Paygrade. Whenever I try to do this: respond_to do |format| format.json { render.json(:json=>@person.to_json(:include=> [:address, {:job=>{:include=>:paygrade}}] } format.xml { render.json(:json=>@person.to_json(:include=> [:address, {:job=>{:include=>:paygrade}}] } } end
I always get the following error: You have a nil object when you didn't expect it. Error evaluating nil.ma. Based on my understanding the :include is expecting an array but I'm adding a hash as an element and Rails is not expecting it in the way I'm specifying?
Where I also continually run into problems is where I have multiple peer associations at the same level with one of them needing requiring a custom method to be serialized.
Question 1: What is the correct way to be able to specify that I need to serialize the Person with address and job along with the paygrade for the job? This is the multiple peers with deep drill down problem mentioned above.
Question 2: What is the correct way to be able to specify that I need to serialize the Person with address and job along with the custom Job Title method with the paygrade? When I try this, I get error:
respond_to do |format| format.json { render.json(:json=>@person.to_json(:include=> [:address, {:job=>{:methods=>:title, :include=>:paygrade}}] } format.xml { render.json(:json=>@person.to_json(:include=> [:address, {:job=>{:methods=>:title, :include=>:paygrade}}] } } end
Please advise, and thanks in advance.