好的,我从查询中得到了一些记录,就像这样。
works = Work.do_a_long_query_with_scope(....)
在我的控制器中,我想找到一些基于此作品的其他内容' ids,然后返回此作品作为回应
def index
works = Work.do_a_long_query_with_scope(....)
not_finished_tasks = Task.find_not_finished_tasks_of_user(works.ids, current_user.id)
# do some job with those tasks
render json: works
end
这样可以正常工作,除了它创建了2个查询,1个用SELECT works.id FROM works ...
用于该任务函数,1个用SELECT works.* from works ...
用于序列化器响应。
那么我可以使用works.ids
而不向DB提出另一个请求吗?
答案 0 :(得分:0)
您可以使用#load
告诉关系加载数据库中的所有内容:
works = Work.do_a_long_query_with_scope(....)
works.load
not_finished_tasks = Task.find_not_finished_tasks_of_user(works.ids, current_user.id)
# do some job with those tasks
render json: works
works.load
之后,works.ids
调用会将id
拉出已加载的Work
实例,而不是返回数据库。
此外,如果您的Task.find_not_finished_tasks_of_user
来电正在执行以下操作:
where(id: array_of_work_ids)
然后您可以传递整个works
关系并说:
where(id: works.select(:id))
使用子查询而不是将所有id
发送回数据库。第一个会做类似的事情:
where id in (a_big_list_of_ids)
但第二个会做:
where id in (select id from ...)
根据works.ids
的大小,可能会有或没有明显的差异。如果在id
调用和子查询执行之间更改数据库,则子查询还有可能为您提供不同的load
。