Rails 3.2查询 - .exists?

时间:2012-03-28 20:11:04

标签: ruby-on-rails activerecord rails-activerecord

我有大约500个网点。每个插座每天至少监控一次。我正在尝试获取每天监控的网点列表。

我现在遇到查询问题,感谢任何帮助:

<% for outlet in @outlets %>
    <% if Monitoring.exists?( :outlet_id => outlet.id, 'DATE(created_at) = ?', Date.today ) %>

@outlets是一个包含Outlet.all的实例变量。

此查询给我留下了语法错误。这样做的正确方法是什么?我正在尝试检查监控是否属于Outlet,并且监控记录是今天创建的。

另外,我不完全确定此查询的速度影响。一次页面上最多可以有2000个出口(它是一个仪表板,因此它们显示为红色或绿色点)。

非常感谢任何帮助。

1 个答案:

答案 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的查询结合起来。