JSON 包含语法

7

我的设置:Rails 2.3.10,Ruby 1.8.7

我有一组相当复杂的模型之间的关系。

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

我在处理JSON语法时遇到问题,需要获取所有以classA开头的相关信息。这是目前为止我所做的。

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

我无法让语法也包括classD和相关的classE记录。

更新实际上像这样做可能会起作用,但我不能混合哈希和数组。

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

请注意,我在上面的示例代码中没有使用单数/复数形式,但在我的真实代码中,我是这样做的。非常感谢您提供任何见解。
谢谢, Bob

我假设classA是类A的一个对象 - iconoclast
3个回答

13

这应该可以工作:

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

没错,那个有效了,我自己也得出了同样的结论,这是一个棘手的小语法错误。 - Bob
加个赞 - 当您在一个级别上有多个关系,并且其中至少有一个子包含时,似乎需要添加=> {}。 - Parrots

1

我不知道你是否想通过类C和类D都包含类E,但是这应该可以工作:

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

编辑:

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
我之前尝试过这个,但它会抛出一个不明确的错误:“未定义方法`macro'用于nil:NilClass”。 - Bob
好的,那么为了确保一下,我假设classA并不是实际的模型,而是classA的一个实例,对吗?然后,我会检查你的关联,因为在你的示例中,你混合使用了belongs_to和has_many,但是关联只是以classA为例命名的。请确保在您的关联和to_json中使用匹配的单数/复数语法。 - DanneManne
你是对的,JSON行中的classA是一个实例,我在上面没有使用正确的单数/复数语法,但在我的代码中,我已经使用了。:include代码应该全部是复数形式。 - Bob
除了classE,它只通过belongs_to :classE进行关联。抱歉,除非您发布实际代码,否则我无法确定。我已经在自己的项目中尝试了类似设置的语法,并且对我有效。 - DanneManne
不确定您所说的“classE仅通过belongs_to:classE关联”是什么意思?根据您的示例,我已经更新了我的问题,并提供了一些可能有效但并不完全正确的内容。 - Bob
我的意思是,由于classE是belongs_to关系,所以它应该被定义为单数形式,而不是复数形式。我会再次尝试澄清。 - DanneManne

1

试试这个,你只需要一个:include =>

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接