アイテムを検索する機能に取り組んでいます。
私のモデルは、おおよそ次のとおりです。
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 で熱心にロードせずにリクエストをやり直し、結果を手動でマージすることですが、これは複雑ですか?
他の提案はありますか?