2012-03-28 65 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