RoR 嵌套 :include 以在 to_xml/to_json 中包含子资源
Posted
技术标签:
【中文标题】RoR 嵌套 :include 以在 to_xml/to_json 中包含子资源【英文标题】:RoR nested :include to include sub-resources in to_xml/to_json 【发布时间】:2011-05-25 12:00:20 【问题描述】:我有一个奇怪的数据模型情况,所以也许我的整个方法都是错误的。这就是我正在做的事情:
我有一个名为 Bird 的类和一个名为 Color 的简单类。从概念上讲,每只鸟都有两种与颜色的关联,一种是雄性颜色,一种是雌性颜色。我处理这个问题的方法是使用一个名为 BirdColoration 的连接模型,它属于鸟和颜色,并且有一个额外的布尔字段来判断颜色是男性还是女性。所以每只鸟实际上都有一个 to_many 到 BirdColoration 的关系,以及一个 to_many 到 Color :through BirdColoration 的关系。如果这听起来合理,请继续阅读。否则,停下来告诉我为什么不对!
我需要能够将鸟表转储为 json。以前,当每只鸟只有一个 to_many 与颜色的关联时,我可以使用 :include 将每只鸟的颜色包含在 json 转储中。现在,我将 BirdColorations 包含在转储中,但我仍然需要获取颜色模型本身。我可以分别包含每只鸟的颜色和颜色,然后在解析时匹配它们,但我更愿意直接包含每种颜色的颜色。像
format.json render :json => @birds.to_json(:include => [:bird_colorations => :color, :seasons, :habitats, :image_holders])
但是,上述方法不起作用。我认为这应该是可能的。谁能指出我如何处理这个问题的正确方向?
现在,我将分别包含每只鸟的颜色和颜色,并在解析时将它们匹配起来。至少我知道这会奏效。
谢谢!
【问题讨论】:
【参考方案1】:我找到了答案here。 to_xml 和 to_json 中 :include 选项的语法与 ActiveRecord 的 find 方法不同。要以这种方式包含嵌套资源,请传入哈希而不是数组。对我来说正确的方法调用如下:
format.json render :json => @birds.to_json(:include => :bird_colorations => :include => :color, :seasons => , :habitats => , :image_holders => )
与我的问题中的比较,看看有什么不同。对于您不想包含子资源的资源,只需传递一个空哈希作为其符号化名称的值。
生活和学习!
【讨论】:
我也是@brutuscat。救了我的培根! 你问题中的代码看起来更干净,这太违反直觉了。特别是因为如果您没有 bird_colorations 嵌套颜色,那么问题示例将起作用。感谢您发布您的解决方案。 Rails 应该可以解决这个问题...【参考方案2】:如果您有一个复杂的 JSON 结构,最好在您的模型中覆盖 serializable_hash
或 as_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
这两个函数只需要返回一个哈希值。
【讨论】:
谢谢!我会看看这个。如果我对从 render :json 获得的输出感到满意,是否还有其他理由覆盖这些方法(可能是性能)?在所有其他条件相同的情况下,我的直觉是让内置功能为我处理一切。 我不认为你会得到性能提升,因为渲染 json 在后台调用 as_json/serializable_hash。这只是一个很好的设计理念,叫做“胖模型,瘦控制器”,在这里讨论得最优雅:***.com/questions/2550376/…以上是关于RoR 嵌套 :include 以在 to_xml/to_json 中包含子资源的主要内容,如果未能解决你的问题,请参考以下文章
AttributeError:模块“pandas”没有属性“read_xml”或“to_xml”