我有一个查询,可以获取所有图片并过滤当前用户上传,评分和喜爱的图片。但这耗费更多时间。请参阅以下查询并建议最佳查询以减少执行时间。
@images = Image.active_images.order('images_order')
.where.not(user_id: current_user.id)
.select{|item| item.ratings.where(user_id: current_user.id).count <= 0 }
.select{|item| item.favorite_images.where(user_id: current_user.id).count <= 0 }
答案 0 :(得分:4)
你可以从摆脱N + 1个查询开始。请参阅http://guides.rubyonrails.org/active_record_querying.html。
您使用的预加载关联将显着缩短执行时间。
更大的推动力是使用AREL或纯SQL在一个查询中完成所有这些。
可能的解决方案:
Image.active_images.joins(:ratings, :favorite_images)
.where.not(user_id: current_user.id)
.where.not(ratings: { user_id: current_user.id})
.where.not(favorite_images: { user_id: current_user.id })
.distinct #Joining has_many associations might duplicate the image records in your select, so use distinct
.order(:images_order)