我想检索特定用户内容的所有下载列表。例如,如果我有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)
我确信有一种方法可以通过表连接来实现这一点。 更新:显式配置所有关联。
答案 0 :(得分:1)
假设显式配置了所有关联,您可以使用以下内容:
Download.joins(:upload).where("uploads.user_id = ?", 3)
您可以通过做出一些假设来改善您的查询:
pluck
而不是映射到ID 以下是使用2个优化查询但没有JOIN的示例:
@downloads = Download.where(upload_id: Upload.where(user_id: 3).ids)