我有大约500个网点。每个插座每天至少监控一次。我正在尝试获取每天监控的网点列表。
我现在遇到查询问题,感谢任何帮助:
<% for outlet in @outlets %>
<% if Monitoring.exists?( :outlet_id => outlet.id, 'DATE(created_at) = ?', Date.today ) %>
@outlets是一个包含Outlet.all的实例变量。
此查询给我留下了语法错误。这样做的正确方法是什么?我正在尝试检查监控是否属于Outlet,并且监控记录是今天创建的。
另外,我不完全确定此查询的速度影响。一次页面上最多可以有2000个出口(它是一个仪表板,因此它们显示为红色或绿色点)。
非常感谢任何帮助。
答案 0 :(得分:2)
您收到语法错误,因为您正在尝试混合使用隐式哈希和隐式数组参数:
Monitoring.exists?(:outlet_id => outlet.id, 'DATE(created_at) = ?', Date.today)
exists?
方法希望Hash作为其单个参数。您想在查询中使用SQL函数,这意味着您必须使用Model.where(...).exists?
表单:
Monitoring.where(:outlet_id => outlet.id).where('date(created_at) = ?', Date.today).exists?
这仍然让你一遍又一遍地点击数据库来点亮你的灯。你可以用这样的东西预先计算整个混乱:
counts = Monitoring.where('date(created_at) = ?', Date.today).count(:group => :outlet_id)
然后在循环中使用counts.has_key? outlet.id
。添加where(:outlet_id => outlet_ids)
(其中outlet_ids
是您感兴趣的ID)也可能有意义。您也许可以将count
查询与生成@outlets
的查询结合起来。