2012-03-28 86 views
2

我有大约500个网点。每个插座每天至少监视一次。我正在尝试获取每天都进行监控的网点列表。我有此刻的查询问题Rails 3.2查询 - .exists?

,任何帮助表示赞赏:

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

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

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

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

任何帮助极大的赞赏。

回答

2

因为你想混合隐式Hash和隐式数组变量你得到一个语法错误:

Monitoring.exists?(:outlet_id => outlet.id, 'DATE(created_at) = ?', Date.today) 

exists?方法想要一个哈希作为它的一个参数。你想用在查询虽然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的查询结合起来。

+0

谢谢,你是对的,我不能相信我错过了。关于多次访问数据库的性能,您完全正确。我真的不知道'counts = Monitoring.where('date(created_at)=?',Date.today).count(:group =>:outlet_id)'是如何工作的,能否请你进一步解释一下,看起来很有趣! – Ammar 2012-03-28 21:38:21

+0

@Ammar:这个想法是为今天的每个'outlet_id'计算所有的匹配,并且你可以在一个查询中做到这一点(即在命中数据库时)。结果将只有“存在?”将返回true的条目。 – 2012-03-28 22:16:09

+0

我将如何使用'counts.has_key? outlet.id'我从来没有遇到过这样的事情,所以请原谅我稍微不清醒:P感谢迄今为止的帮助! – Ammar 2012-03-28 22:47:08