我正在开发一项搜索项目的功能。
我的模型大致是这样的:
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 的情况下重做请求而不预先加载,然后手动合并结果,但这很复杂吗?
还有其他建议吗?