如何防止另一个链再次查询db

时间:2014-04-26 21:31:16

标签: ruby-on-rails-4

我有一个名为work_shift_stops的对象,使用.where创建,经过修改后限制为startend_time,代码如下:

  work_shift_stops = Stoppage20.where(["machine20_id = :machine20_id AND (end_time >= :start AND start <= :end_time)",
    { machine20_id: params[:shift_result][:machine20_id], 
      end_time: work_shift.end, 
      start: work_shift.first}])
  work_shift_stops.each do |ws|
    ws.start = work_shift.first if ws.start < work_shift.first
    ws.end_time = work_shift.end if ws.end_time > work_shift.end
  end

此外,在我的代码中,我正在使用对象上的另一个链:

  load_time = open_time - work_shift_stops.where(stop20_id: Stop20.where(stop_group20_id: 3).pluck(:id)).sum(:duration)

这会产生令人不快的结果,因为rails正在进行另一个数据库查询,该查询会检索work_shift_stops未经修改的startend_time限制:

SELECT SUM("stoppage20s"."duration") AS sum_id FROM "stoppage20s" WHERE (machine20_id = '1' AND (end_time >= '2013-03-02 05:00:00.000000' AND start <= '2013-03-02 17:00:00.000000')) AND "stoppage20s"."stop20_id" IN (12, 17)

问题是如何阻止rails进行另一个db查询并使用带有修改属性的对象?

1 个答案:

答案 0 :(得分:0)

我实际做的是删除.sum(:duration)函数并使用修改后的work_shift_stopsstart迭代活动记录集end_time

work_shift_stops.each do |wsd|
    planned_stops_time += wsd.duration if Stop20.where(stop_group20_id: 3).pluck(:id).include? wsd.stop20_id 
    tech_stops_time += wsd.duration if Stop20.where(stop_group20_id: 1).pluck(:id).include? wsd.stop20_id
    org_stops_time += wsd.duration if Stop20.where(stop_group20_id: 2).pluck(:id).include? wsd.stop20_id
end