Rails - 嵌套在Active Records上?

ary*_*axt 159 ruby-on-rails rails-activerecord

我有一个我获取的事件列表.我正在尝试包括与此事件关联的每个用户以及与每个用户关联的每个配置文件.用户包括但不包括他们的个人资料.

我该怎么做

Event.includes(:users [{profile:}])
Run Code Online (Sandbox Code Playgroud)

文档似乎并不清楚:http: //guides.rubyonrails.org/active_record_querying.html

Joe*_*edy 383

我相信以下内容适合您.

Event.includes(users: :profile)
Run Code Online (Sandbox Code Playgroud)

如果你想要包含一个已经包含的关联(我们称之为B)的关联(我们称之为C),你将使用上面的语法.但是,如果您还想包含D,这也是B的关联,那么当您使用Rails指南中的示例中给出的数组时.

A.includes(bees: [:cees, :dees])
Run Code Online (Sandbox Code Playgroud)

您可以继续嵌套包含(如果您确实需要).假设A也与Z相关联,并且C与E和F相关联.

A.includes( { bees: [ { cees: [:ees, :effs] }, :dees] }, :zees)
Run Code Online (Sandbox Code Playgroud)

为了好玩,我们还会说E与J和X相关联,并且D与Y相关联.

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

  • 您将如何为包含的模块添加条件..?:) (11认同)
  • 这是我多次发现多年的神奇答案之一,每次都能保存我的屁股.这就是文档应该是什么样子 (5认同)
  • 为了使本指南成为最详尽的指南:`A.includes({bees:{cees:{:dees,:ees}}}))-适用于俄罗斯娃娃式结构(即A包括b,其中包括c ...等等) (2认同)
  • 添加条件`A.includes(bees::cees).where(bees:{cees:{标记:false}})。order(“ a.bees DESC”)。order(“ a.cees ASC”)` (2认同)

asc*_*iel 17

请参考乔肯尼迪的解决方案。

这是一个更具可读性的示例(对于未来的我)。

includes(
  :product,
  :package, {
    campaign: [
      :external_records,
      { account: [:external_records] },
      { agency: [:external_records] },
      :owner,
      :partner,
    ]
  }
)
Run Code Online (Sandbox Code Playgroud)


Bla*_*icz 13

如果有人在做一个respond_to块来生成嵌套的json,你可以这样做:

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