繁体   English   中英

RoR嵌套:include包含to_xml / to_json中的子资源

[英]RoR nested :include to include sub-resources in to_xml/to_json

我有一个奇怪的数据模型情况,所以也许我的整个方法是错误的。 这是我正在做的事情:

我有一个名为Bird的类和一个名为Color的简单类。 从概念上讲,每只鸟有两种与颜色相关的关联,一种用于男性颜色,一种用于女性颜色。 我处理这个的方法是使用一个名为BirdColoration的连接模型,它属于一个鸟和一个颜色,并有一个额外的布尔字段来判断颜色是针对男性还是女性。 因此,每只鸟实际上都与BirdColoration有着很好的关系,而且通过BirdColoration也可以与Color.toman相关。 如果这听起来合理,那么继续阅读。 否则,停下来告诉我为什么这是错的!

我需要能够将鸟桌作为json转储。 以前,当每只鸟只有一个与颜色有关联时,我可以使用:include来包含每个鸟的颜色在json转储中。 现在,我将BirdColorations包括在转储中,但我仍然需要自己使用颜色模型。 我可以单独包括每只鸟的颜色和颜色,然后在解析时匹配它们,但我更愿意直接包括每种颜色的颜色。 就像是

      format.json  { render :json => @birds.to_json(:include => [{:bird_colorations => :color}, :seasons, :habitats, :image_holders]) }

但是,上述方法不起作用。 我认为这应该是可能的。 任何人都可以指出我如何处理这个问题的正确方向?

现在,我将分别包括每只鸟的颜色和颜色,并在解析时匹配它们。 至少我知道这会奏效。

谢谢!

我在这里找到了答案。 to_xml和to_json中的:include选项的语法与ActiveRecord的find方法的语法不同。 要以这种方式包含嵌套资源,请传入散列而不是数组。 对我来说正确的方法调用如下:

      format.json  { render :json => @birds.to_json(:include => {:bird_colorations => {:include => :color}, :seasons => {}, :habitats => {}, :image_holders => {}}) }

与我的问题中的那个相比,看看差异。 对于您不希望包含子资源的资源,只需将空哈希作为其符号名称的值传递。

活到老,学到老!

如果你有一个复杂的JSON结构,最好在模型中覆盖serializable_hashas_json ,而不是尝试通过render :json完成所有操作。

所以像

def serializable_hash(options = nil)
  options ||= {}
  bird = {:name => name, ...}
  bird[:seasons] = seasons.serilizable_hash
  bird[:colors] = ... # whatever complex logic you want to get to the colors
  bird
end

这两个函数只需要返回一个哈希值。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM