Szyny - zagnieżdżone dołączenia w aktywnych rekordach?


Odpowiedzi:


406

Uważam, że poniższe rozwiązania powinny Ci pomóc.

Event.includes(users: :profile)

Jeśli chcesz dołączyć asocjację (nazwijmy ją C) już zawartej asocjacji (nazwiemy ją B), użyj powyższej składni. Jeśli jednak chciałbyś dołączyć również D, które jest również asocjacją B, wtedy użyjesz tablicy, jak podano w przykładzie w Rails Guide .

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

Możesz kontynuować zagnieżdżanie takich elementów (jeśli rzeczywiście potrzebujesz). Powiedz, że A jest również powiązane z Z, a C jest powiązane z E i F.

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

I dla dobrej zabawy powiemy również, że E jest powiązane z J i X, a D jest powiązane z Y.

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

11
Jak dodałbyś warunki dla dołączonych modułów ..? :)
Arup Rakshit

1
jak dodać tam zamówienie?
Florian Widtmann

6
To jedna z tych magicznych odpowiedzi, które znajdowałem wiele razy w odstępie lat i za każdym razem ratują mi tyłek. Tak powinny wyglądać dokumenty
Andrzej

2
Aby uczynić ten przewodnik najbardziej wyczerpującym: A.includes( { bees: { cees: {:dees, :ees} } })- dla rosyjskiej konstrukcji przypominającej lalkę (tj. A zawiera b, które obejmuje c ... i tak dalej)
Alexander Gorg

2
aby dodać warunkiA.includes(bees: :cees).where(bees: { cees: { flagged: false }}).order("a.bees DESC").order("a.cees ASC")
Fabrizio Bertoglio

14

Jeśli ktoś wykonuje respond_toblok w celu wygenerowania zagnieżdżonego pliku JSON, możesz zrobić coś takiego:

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

1
Myślę, że masz na myśli as_json- w przeciwnym razie renderuje ciąg JSON.
Meekohi

10

Proszę zapoznać się z rozwiązaniem Joe Kennedy'ego.

Oto bardziej czytelny przykład (dla mnie w przyszłości).

includes(
  :product,
  :package, {
    campaign: [
      :external_records,
      { account: [:external_records] },
      { agency: [:external_records] },
      :owner,
      :partner,
    ]
  }
)
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.