Rails-活动记录中的嵌套包含?


Answers:


406

我相信以下内容对您有用。

Event.includes(users: :profile)

如果要包括已经包含的关联(我们将其称为B)的关联(我们将其称为C),则可以使用上面的语法。但是,如果您也想包含D(它也是B的关联),那就是使用Rails Guide中示例中给出的数组。

A.includes(bees: [:cees, :dees])

您可以继续嵌套这样的包含(如果您确实需要)。假设A也与Z关联,C与E和F关联。

A.includes( { bees: [ { cees: [:ees, :effs] }, :dees] }, :zees)

为了好玩,我们还说E与J和X关联,而D与Y关联。

A.includes( { bees: [ { cees: [ { ees: [:jays, :exes] }, :effs] }, { dees: :wise } ] }, :zees)

11
您如何为所包含的模块添加条件?:)
奥雅纳(Arup)Rakshit,2015年

1
如何添加订单?
Florian Widtmann

6
这是我相隔数年才发现的神奇答案之一,每次都会节省我的屁股。这就是文档的样子
Andrew

2
要使本指南成为最疲惫的指南:A.includes( { bees: { cees: {:dees, :ees} } })-对于类似结构的俄罗斯娃娃(即A包括b,其中包括c ...依此类推)
Alexander Gorg

2
添加条件A.includes(bees: :cees).where(bees: { cees: { flagged: false }}).order("a.bees DESC").order("a.cees ASC")
Fabrizio Bertoglio

14

如果有人在respond_to阻止生成嵌套的json,则可以执行以下操作:

respond_to do |f|
  f.json do
    render json: event.to_json(include: {users: {include: :profile} }), status: :ok
  end
end

1
我想你的意思是as_json-否则将呈现JSON字符串。
Meekohi

10

请参考Joe Kennedy的解决方案。

这是一个更具可读性的示例(供将来使用)。

includes(
  :product,
  :package, {
    campaign: [
      :external_records,
      { account: [:external_records] },
      { agency: [:external_records] },
      :owner,
      :partner,
    ]
  }
)
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.