Rails - Nested bao gồm trên Active Records?


166

Tôi có một danh sách các sự kiện mà tôi lấy. Tôi đang cố gắng bao gồm mọi người dùng liên quan đến sự kiện này và mọi hồ sơ liên quan đến từng người dùng. Người dùng được bao gồm nhưng không phải hồ sơ của họ.

Làm thế nào tôi sẽ làm điều này

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

Các tài liệu dường như không rõ ràng: http://guides.rubyonrails.org/active_record_querying.html

Câu trả lời:


406

Tôi tin rằng sau đây nên làm việc cho bạn.

Event.includes(users: :profile)

Nếu bạn muốn bao gồm một hiệp hội (chúng tôi sẽ gọi nó là C) của một hiệp hội đã được bao gồm (chúng tôi sẽ gọi nó là B), bạn sẽ sử dụng cú pháp ở trên. Tuy nhiên, nếu bạn cũng muốn bao gồm D, cũng là một liên kết của B, thì đó là khi bạn sử dụng mảng như được nêu trong ví dụ trong Hướng dẫn Rails .

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

Bạn có thể tiếp tục lồng bao gồm như thế (nếu bạn thực sự cần). Giả sử A cũng được liên kết với Z và C được liên kết với E và F.

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

Và để vui vẻ, chúng tôi cũng sẽ nói rằng E được liên kết với J và X, và D được liên kết với Y.

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

11
Làm thế nào bạn sẽ thêm điều kiện cho các mô-đun bao gồm ..? :)
Arup Rakshit

1
Làm thế nào để thêm một đơn đặt hàng?
Florian Widtmann

6
Đây là một trong những câu trả lời kỳ diệu mà tôi đã tìm thấy cách nhau nhiều năm và cứu lấy mông của tôi mỗi lần. Đây là những gì các tài liệu nên trông giống như
Andrew

2
Để làm cho hướng dẫn này trở nên mệt mỏi nhất: A.includes( { bees: { cees: {:dees, :ees} } })- đối với búp bê Nga như xây dựng (tức là A bao gồm b, bao gồm c ... vân vân)
Alexander Gorg

2
để thêm điều kiệnA.includes(bees: :cees).where(bees: { cees: { flagged: false }}).order("a.bees DESC").order("a.cees ASC")
Fabrizio Bertoglio 11/11/19

14

Nếu bất cứ ai đang thực hiện một respond_tokhối để tạo json lồng nhau, bạn có thể làm một cái gì đó như:

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

1
Tôi nghĩ bạn có nghĩa là as_json- nếu không điều này làm cho chuỗi JSON.
Meekohi

10

Vui lòng tham khảo giải pháp của Joe Kennedy.

Đây là một ví dụ dễ đọc hơn (cho tôi trong tương lai).

includes(
  :product,
  :package, {
    campaign: [
      :external_records,
      { account: [:external_records] },
      { agency: [:external_records] },
      :owner,
      :partner,
    ]
  }
)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.