Rails - ซ้อนรวมอยู่ใน Active Records แล้วหรือยัง?


166

ฉันมีรายการเหตุการณ์ที่ฉันเรียกมา ฉันกำลังพยายามรวมผู้ใช้ทุกคนที่เกี่ยวข้องกับกิจกรรมนี้และทุกโปรไฟล์ที่เชื่อมโยงกับผู้ใช้แต่ละคน ผู้ใช้จะถูกรวมไว้ แต่ไม่รวมถึงโปรไฟล์ของพวกเขา

ฉันจะทำสิ่งนี้ได้อย่างไร

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

เอกสารดูเหมือนจะไม่ชัดเจน: http://guides.rubyonrails.org/active_record_querying.html

คำตอบ:


406

ฉันเชื่อว่าสิ่งต่อไปนี้ควรใช้กับคุณ

Event.includes(users: :profile)

หากคุณต้องการรวมการเชื่อมโยง (เราจะเรียกมันว่า C) ของการเชื่อมโยงที่รวมอยู่แล้ว (เราจะเรียกมันว่า B) คุณจะต้องใช้ไวยากรณ์ด้านบน แต่ถ้าคุณต้องการรวม D เช่นกันซึ่งยังเป็นสมาคมของ B ที่เมื่อคุณต้องการใช้อาร์เรย์ตามที่กำหนดในตัวอย่างในคู่มือ Rails

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 รวมถึง b ซึ่งรวมถึง c ... และอื่น ๆ )
Alexander Gorg

2
เพื่อเพิ่มเงื่อนไขA.includes(bees: :cees).where(bees: { cees: { flagged: false }}).order("a.bees DESC").order("a.cees ASC")
Fabrizio

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.