【问题标题】:JSON include syntaxJSON 包含语法
【发布时间】:2011-01-11 03:13:04
【问题描述】:

我的设置: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

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

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

我无法让语法同时包含 classD 和相关的 classE 记录。

更新实际上这样的事情可能会起作用,只是我不能混合哈希和数组

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

请注意,我在上面的示例代码中没有使用单数/复数,但在我的真实代码中,我是。任何见解将不胜感激。

谢谢, 鲍勃

【问题讨论】:

  • 我假设 classA 是 A 类的 object?

标签: ruby-on-rails json


【解决方案1】:

这应该可行:

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

【讨论】:

  • 是的,这行得通,我自己也得出了同样的结论,狡猾的小语法虫。
  • 投赞成票 - 当您在一个级别有多个关系并且其中至少一个具有子包含时,似乎需要添加 => {}
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    我不知道您是否希望 classE 包含在 class C 和 classD 中,但这应该可以:

    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 } })
    

    【讨论】:

    • 我以前试过这个,它抛出了这个不起眼的错误“undefined method `macro' for nil:NilClass”
    • 好的,那么为了确保,我假设 classA 实际上不是模型,而是 classA 的一个实例,对吧?之后,我会检查您的关联,因为在您的示例中,您混合了 belongs_to 和 has_many,但例如,关联只是命名为 classA。只需确保在关联和 to_json 中使用匹配的单数/复数语法。
    • 你是对的,JSON 行中的 classA 是一个实例,我没有使用上面正确的单数/复数语法,但在我的代码中,我是。 :include 代码应该都是复数形式。
    • 除了classE,它只通过belongs_to关联:classE 抱歉,除非您发布您的实际代码,否则我无法确定。我已经在自己的项目中尝试过使用类似设置的语法,它对我有用。
    • 不确定您所说的“classE 仅通过 belongs_to :classE 关联”是什么意思?根据您的示例,我用一些可能有效但不完全正确的方法更新了我的问题。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-21
    • 2014-08-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多