Rails - Nested termasuk pada Rekaman Aktif?

166

Saya memiliki daftar acara yang saya ambil. Saya mencoba untuk memasukkan setiap pengguna yang terkait dengan acara ini dan setiap profil yang terkait dengan setiap pengguna. Pengguna dimasukkan tetapi tidak profil mereka.

Bagaimana saya melakukan ini

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

Dokumen sepertinya tidak jelas: http://guides.rubyonrails.org/active_record_querying.html

aryaxt
sumber

Jawaban:

406

Saya percaya yang berikut ini akan berhasil untuk Anda.

Event.includes(users: :profile)

Jika Anda ingin menyertakan asosiasi (kami akan menyebutnya C) dari asosiasi yang sudah disertakan (kami akan menyebutnya B), Anda akan menggunakan sintaksis di atas. Namun, jika Anda ingin memasukkan D juga, yang juga merupakan asosiasi B, saat itulah Anda akan menggunakan array seperti yang diberikan dalam contoh dalam Panduan Rails .

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

Anda dapat terus memasukkan sarang seperti itu (jika Anda benar-benar perlu). Katakan bahwa A juga dikaitkan dengan Z, dan bahwa C dikaitkan dengan E dan F.

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

Dan untuk bersenang-senang, kami juga akan mengatakan bahwa E dikaitkan dengan J dan X, dan bahwa D dikaitkan dengan Y.

A.includes( { bees: [ { cees: [ { ees: [:jays, :exes] }, :effs] }, { dees: :wise } ] }, :zees)
Joe Kennedy
sumber
11
Bagaimana Anda menambahkan kondisi untuk modul yang disertakan ..? :)
Arup Rakshit
1
bagaimana cara menambahkan pesanan?
Florian Widtmann
6
Ini adalah salah satu jawaban ajaib yang telah saya temukan beberapa kali bertahun-tahun terpisah dan menyelamatkan pantat saya setiap kali. Seperti inilah seharusnya dokumen itu
Andrew
2
Untuk membuat panduan ini yang paling melelahkan: A.includes( { bees: { cees: {:dees, :ees} } })- untuk boneka Rusia seperti konstruksi (yaitu A termasuk b, yang mencakup c ... dan seterusnya)
Alexander Gorg
2
untuk menambah kondisiA.includes(bees: :cees).where(bees: { cees: { flagged: false }}).order("a.bees DESC").order("a.cees ASC")
Fabrizio Bertoglio
14

Jika ada yang melakukan respond_toblok untuk menghasilkan nested json, Anda dapat melakukan sesuatu seperti:

respond_to do |f|
  f.json do
    render json: event.to_json(include: {users: {include: :profile} }), status: :ok
  end
end
Blaskovicz
sumber
1
Saya pikir maksud Anda as_json- jika tidak, ini membuat string JSON.
Meekohi
10

Silakan merujuk ke solusi Joe Kennedy.

Inilah contoh yang lebih mudah dibaca (untuk saya di masa mendatang).

includes(
  :product,
  :package, {
    campaign: [
      :external_records,
      { account: [:external_records] },
      { agency: [:external_records] },
      :owner,
      :partner,
    ]
  }
)
aschyiel
sumber