【问题标题】:RoR nested :include to include sub-resources in to_xml/to_jsonRoR 嵌套 :include 以在 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]) }

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

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

谢谢!

【问题讨论】:

    标签: ruby-on-rails json include has-many-through


    【解决方案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_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
    

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

    【讨论】:

    • 谢谢!我会看看这个。如果我对从 render :json 获得的输出感到满意,是否还有其他理由覆盖这些方法(可能是性能)?在所有其他条件相同的情况下,我的直觉是让内置功能为我处理一切。
    • 我不认为你会得到性能提升,因为渲染 json 在后台调用 as_json/serializable_hash。这只是一个很好的设计理念,叫做“胖模型,瘦控制器”,在这里讨论得最优雅:stackoverflow.com/questions/2550376/…
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-06-20
    • 2021-10-11
    • 2011-06-04
    • 1970-01-01
    相关资源
    最近更新 更多