我有一个名为work_shift_stops
的对象,使用.where创建,经过修改后限制为start
和end_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
未经修改的start
和end_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查询并使用带有修改属性的对象?
答案 0 :(得分:0)
我实际做的是删除.sum(:duration)函数并使用修改后的work_shift_stops
和start
迭代活动记录集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