如何改进Rails查询以拒绝列表中的当前用户项?

时间:2016-12-13 12:09:43

标签: ruby-on-rails active-record-query

我有一个查询,可以获取所有图片并过滤当前用户上传,评分和喜爱的图片。但这耗费更多时间。请参阅以下查询并建议最佳查询以减少执行时间。

@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 }

1 个答案:

答案 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)