Rails-Active Records에 중첩 된 포함?


166

내가 가져 오는 이벤트 목록이 있습니다. 이 이벤트와 관련된 모든 사용자와 각 사용자와 관련된 모든 프로필을 포함 시키려고합니다. 사용자는 포함되지만 프로필은 포함되지 않습니다.

내가 어떻게 할까

Event.includes(:users [{profile:}])

문서가 명확하지 않은 것 같습니다 : http://guides.rubyonrails.org/active_record_querying.html

답변:


406

나는 다음이 당신에게 도움이 될 것이라고 믿습니다.

Event.includes(users: :profile)

이미 포함 된 연결 (B라고 함)의 연결 (C라고 함)을 포함하려면 위의 구문을 사용합니다. 그러나 B를 연결하는 D도 포함 시키려면 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

1
주문을 추가하는 방법?
Florian Widtmann

6
이것은 여러 해에 걸쳐 발견하고 매번 내 엉덩이를 구해낸 마법의 대답 중 하나입니다. 문서는 다음과 같습니다.
Andrew

2
이 안내서를 가장 소진하게 만들기 위해 : A.includes( { bees: { cees: {:dees, :ees} } })-건축과 같은 러시아 인형 (예 : A는 c를 포함하는 b를 포함합니다)
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,
    ]
  }
)
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.