RubyNewbie
2009-Jan-21 02:47 UTC
Nested serialization with to_json and to_xml with array and hash element
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. --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
RubyNewbie
2009-Jan-21 03:47 UTC
Re: Nested serialization with to_json and to_xml with array and hash element
The error description above was slightly truncated. The full error is this: You have a nil object when you didn''t expect it! The error occurred while evaluating nil.macro --~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
scho
2009-Mar-17 14:56 UTC
Re: Nested serialization with to_json and to_xml with array and hash element
Hi Folks, I ran into the same problem. Here is my fix, which solved the problem (I''ve added it to my environment.rb): module ActiveRecord module Serialization class Serializer def add_includes_with_nested_include(&block) if include_associations = options.delete(:include) base_only_or_except = { :except => options[:except], :only => options[:only] } include_has_options = include_associations.is_a?(Hash) associations = include_has_options ? include_associations.keys : Array(include_associations) for association in associations association_has_options = association.is_a?(Hash) if association_has_options macro_association = association.keys.first additional_association_options = association [macro_association] else additional_association_options = {} macro_association = association end macro = @record.class.reflect_on_association (macro_association).macro records = case macro when :has_many, :has_and_belongs_to_many @record.send(macro_association).to_a when :has_one, :belongs_to @record.send(macro_association) end unless records.nil? association_options = include_has_options ? include_associations[macro_association] : base_only_or_except opts = options.merge(association_options).merge (additional_association_options) yield(macro_association, records, opts) end end options[:include] = include_associations end end alias_method_chain :add_includes, :nested_include end end end If someone wants to commit this to github, more power to you! scho On 21 Jan., 04:47, RubyNewbie <CalvinAnhNgu...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote:> The error description above was slightly truncated. > The full error is this: You have a nil object when you didn''t expect > it! The error occurred while evaluating nil.macro--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org For more options, visit this group at groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---
scho
2009-Mar-18 11:06 UTC
Re: Nested serialization with to_json and to_xml with array and hash element
Hi again, I found out, that the following works as well: Instead of [:address, {:job=>{:include=>:paygrade}}] try {:address => {}, {:job=>{:include=>:paygrade}}} scho On 17 Mrz., 15:56, scho <georgmeye...-gM/Ye1E23mwN+BqQ9rBEUg@public.gmane.org> wrote:> Hi Folks, > > I ran into the same problem. Here is my fix, which solved the problem > (I''ve added it to my environment.rb): > > module ActiveRecord > module Serialization > class Serializer > def add_includes_with_nested_include(&block) > if include_associations = options.delete(:include) > base_only_or_except = { :except => options[:except], > :only => options[:only] } > > include_has_options = include_associations.is_a?(Hash) > associations = include_has_options ? > include_associations.keys : Array(include_associations) > > for association in associations > association_has_options = association.is_a?(Hash) > if association_has_options > macro_association = association.keys.first > additional_association_options = association > [macro_association] > else > additional_association_options = {} > macro_association = association > end > macro = @record.class.reflect_on_association > (macro_association).macro > records = case macro > when :has_many, :has_and_belongs_to_many > @record.send(macro_association).to_a > when :has_one, :belongs_to > @record.send(macro_association) > end > unless records.nil? > association_options = include_has_options ? > include_associations[macro_association] : base_only_or_except > opts = options.merge(association_options).merge > (additional_association_options) > yield(macro_association, records, opts) > end > end > > options[:include] = include_associations > end > end > alias_method_chain :add_includes, :nested_include > end > end > end > > If someone wants to commit this to github, more power to you! > > scho > > On 21 Jan., 04:47, RubyNewbie <CalvinAnhNgu...-Re5JQEeQqe8AvxtiuMwx3w@public.gmane.org> wrote: > > > The error description above was slightly truncated. > > The full error is this: You have a nil object when you didn''t expect > > it! The error occurred while evaluating nil.macro--~--~---------~--~----~------------~-------~--~----~ You received this message because you are subscribed to the Google Groups "Ruby on Rails: Talk" group. To post to this group, send email to rubyonrails-talk-/JYPxA39Uh5TLH3MbocFFw@public.gmane.org To unsubscribe from this group, send email to rubyonrails-talk+unsubscribe@googlegroups.com For more options, visit this group at groups.google.com/group/rubyonrails-talk?hl=en -~----------~----~----~----~------~----~------~--~---