使用表连接改进查询?

时间:2016-06-26 10:37:14

标签: ruby-on-rails activerecord

我想检索特定用户内容的所有下载列表。例如,如果我有2次上传,我想过滤下载表的内容,只显示与我的上传相关的下载。

Users {
    user_id: integer
}

Upload {
    upload_id: integer
    user_id: integer (FK)
}

Download {
    download_id: integer
    upload_id: integer (FK)
}

下载表是在我的博客上下载文件("上传")的每个公共用户的日志。 如您所见,上传链接到用户(用户可以有很多上传),下载链接到上传(一次上传可以多次下载)。

这是我到目前为止使用的解决方案(它非常混乱,可能非常低效):

@user = User.find_by_id(3)
# grab a list of the User 3's upload ids, e.g. [3, 6, 2, 34, 45]
@upload_ids = @user.uploads.map { |u| u.upload_id }

# now find all Downloads that have these id numbers in their upload_id
@downloads = Download.where(:upload_id => @upload_ids)

我确信有一种方法可以通过表连接来实现这一点。 更新:显式配置所有关联。

1 个答案:

答案 0 :(得分:1)

假设显式配置了所有关联,您可以使用以下内容:

Download.joins(:upload).where("uploads.user_id = ?", 3)

您可以通过做出一些假设来改善您的查询:

  1. 您不需要提取用户
  2. 使用pluck而不是映射到ID
  3. 以下是使用2个优化查询但没有JOIN的示例:

    @downloads = Download.where(upload_id: Upload.where(user_id: 3).ids)