#ruby-on-rails #rails-activerecord
#ruby-on-rails #rails-activerecord
Вопрос:
У меня есть список событий, которые я извлекаю. Я пытаюсь включить каждого пользователя, связанного с этим событием, и каждый профиль, связанный с каждым пользователем. Пользователи включаются, но не их профили.
Как бы я это сделал
Event.includes(:users [{profile:}])
Документы, похоже, не понятны:
http://guides.rubyonrails.org/active_record_querying.html
Ответ №1:
Я считаю, что для вас должно сработать следующее.
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)
Комментарии:
1. Как бы вы добавили условия для включенных модулей ..? 🙂
2. как добавить туда порядок?
3. Это один из тех волшебных ответов, которые я находил несколько раз в год и каждый раз спасал свою задницу. Вот как должны выглядеть документы
4. Чтобы сделать это руководство самым утомительным:
A.includes( { bees: { cees: {:dees, :ees} } })
— для конструкции, подобной русской кукле (т. Е. A включает b, которая включает c … и так далее)5. чтобы добавить условия
A.includes(bees: :cees).where(bees: { cees: { flagged: false }}).order("a.bees DESC").order("a.cees ASC")
Ответ №2:
Пожалуйста, обратитесь к решению Джо Кеннеди.
Вот более читаемый пример (для будущего меня).
includes(
:product,
:package, {
campaign: [
:external_records,
{ account: [:external_records] },
{ agency: [:external_records] },
:owner,
:partner,
]
}
)
Ответ №3:
Если кто-то выполняет 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.