Я работаю над функцией поиска элементов.Eager Загрузка только первой страницы результатов с активной записью
Моя модель это, roughtly:
User has many items
User has many addresses
User has one profile
Item has many images
Item has many addresses
Item belongs to category
Я хочу, чтобы отобразить результаты, сгруппированные пользователем, например:
Results for 'Laptop':
Items of Bob:
Laptop dell (details...)
Samsung laptop (details...)
Items of Alice:
Laptop HP (details...)
...
Так что у меня этот большой запрос с жадным загрузки:
r = User.includes([{items: [:images, :addresses, :category]}, :addresses, :profile]).
joins(:items).
where('query like "%laptop%"').
where(...).
limit(80).
all
# then get the first page of results with kaminary
И затем я показываю с такой петлей в erb:
r.each do |u|
# items of user u
u.items do |i|
# item i
end
end
Все работает нормально, за исключением того, что интенсивная загрузка занимает некоторое время. Это может быть намного быстрее, если вы загрузите только элементы на первой странице, которые отображаются.
Возможно с активной записью, чтобы загружать только записи с условием? Что-то вроде: User.includes([:table1, table2], conditions: 'users.id in (1,2,3)')
?
Другим решением было бы выполнить большой запрос с ограничением 20, а затем повторить запрос без активной загрузки с лимитом 80, а затем вручную объединить результаты, но это сложно?
Любые другие предложения?