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])

Ви можете продовжувати гніздо включати такі (якщо вам це потрібно). Скажіть, що А також пов'язаний із 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
як додати туди замовлення?
Флоріан Відтман

6
Це одна з тих чарівних відповідей, які я кілька разів знаходив один від одного і щоразу рятує мою дупу. Ось так повинні виглядати документи
Ендрю

2
Щоб зробити цей посібник найбільш виснажливим: A.includes( { bees: { cees: {:dees, :ees} } })- для російської ляльки, як будівництво (тобто A включає b, що включає c ... і так далі)
Олександр

2
додати умовиA.includes(bees: :cees).where(bees: { cees: { flagged: false }}).order("a.bees DESC").order("a.cees ASC")
Фабріціо Бертоліо

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

Будь ласка, зверніться до рішення Джо Кеннеді.

Ось більш читаний приклад (для мене майбутнього).

includes(
  :product,
  :package, {
    campaign: [
      :external_records,
      { account: [:external_records] },
      { agency: [:external_records] },
      :owner,
      :partner,
    ]
  }
)
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.