从查询结果中获取数据而不进行其他查询

时间:2018-01-23 04:26:19

标签: ruby-on-rails rails-activerecord

好的,我从查询中得到了一些记录,就像这样。

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提出另一个请求吗?

1 个答案:

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