2011-01-11 15 views
7

Mi configuración: Rails 2.3.10, Ruby 1.8.7JSON incluye la sintaxis

Tengo un conjunto bastante complicado de relaciones entre varios modelos.

class A 
    has_many :classB 
    has_many :classD 
end 

class B 
    belongs_to :classA 
    has_many :classC 
end 

class C 
    belongs_to :classB 
    belongs_to :classE 
end 

class D 
    belongs_to :classA 
    belongs_to :classE 
end 

class E 
    has_many :classD 
    has_many :classC 
end 

Tengo un problema con la sintaxis JSON para obtener toda la información relacionada que comienza con classA. Esto es lo que he trabajado hasta ahora.

classA.to_json(:include => {:classB => {:include => [:classC, :classE]}}) 

no puedo obtener la sintaxis de trabajo para incluir también los registros relacionados Classe ClassD y.

ACTUALIZACIÓN hecho algo como esto podría funcionar, excepto que no puedo mezclar los hashes y arrays

classA.to_json(:include => [ :classB => { :include => { :classC => { :include => :classE } } }, 
          :classD, :classE ]) 

Tenga en cuenta que yo no uso del singular/plural en mi código de ejemplo anterior, pero en mi código real , Yo soy. Cualquier idea será muy apreciada.

Gracias, Bob

+0

Asumo 'classA' * es un objeto de la clase * * A *? – iconoclast

Respuesta

13

Esto debería funcionar:

classA.to_json(:include => { 
    :classB => {:include => {:classC => {:include => :classE}}}, 
    :classD => {}, 
    :classE => {}, 
}) 
+0

Sí, eso funcionó, llegué a la misma conclusión yo mismo, pequeño y tramposo sinterizado. – Bob

+0

Tener un voto positivo: agregar => {} parece ser necesario cuando tienes múltiples relaciones en un nivel, y al menos una de ellas tiene una subinclusión en ella – Parrots

1

No sé si quieres Classe incluye tanto a través de la clase C y ClassD pero esto debería funcionar:

classA.to_json(:include => { :classB => { :include => { :classC => { :include => :classE } } }, 
          :classD => { :include => :classE } }) 

EDIT:

class A 
    has_many :bs 
    has_many :ds 
end 

class B 
    belongs_to :a 
    has_many :cs 
end 

class C 
    belongs_to :b 
    belongs_to :e 
end 

class D 
    belongs_to :a 
    belongs_to :e 
end 

class E 
    has_many :ds 
    has_many :cs 
end 

@class_a = A.first 
@class_a.to_json(:include => { :bs => { :include => { :cs => { :include => :e } } }, 
           :ds => { :include => :e } }) 
+1

He intentado esto antes y arroja este error indescriptible "macro' de método indefinido 'para nil: NilClass " – Bob

+0

Bien, entonces solo para asegurarme, supongo que la clase A no es realmente el modelo sino una instancia de clase A, ¿verdad? Y después de eso, verificaría la asociación porque en tu ejemplo mezclas belongs_to y has_many, pero la asociación simplemente se llama classA, por ejemplo. Solo asegúrate de usar la sintaxis singular/plural correspondiente en tus asociaciones y to_json. – DanneManne

+0

Tiene razón, la clase A en la línea JSON es una instancia y no estoy usando la sintaxis singular/plural anterior, pero en mi código, lo soy. El código: include debería ser plural. – Bob

0

Try esto, solo debería necesitar uno :include =>:

classA.to_json(:include => {:classB => [:classC, { :classE => :classD }] }) 
+0

Esto arroja el error "no se puede convertir Array en Hash" – Bob