2013-07-03 55 views
0

在我的應用程序中,我試圖在最近10天內按視圖對項目進行排序。我使用的印象派創業板,創建一個名爲印象的模型,並在這裏記錄每一個視圖。ActiveRecord條件計數

我已經成功地得到了這片代碼:

@items = Item.joins("left join impressions on impressions.impressionable_id = items.id and impressions.impressionable_type = 'Item'") 
        .select("count(distinct(ip_address)) as counter, impressionable_id, items.title, items.id, items.image") 
        .group('items.id') 
        .order("counter desc") 
        .page(params[:page]) 
        .per_page(9) 

這個排序按總獨到的見解的項目。不過,我只想計算過去10天內的展示次數。這使我增加一個where方法,例如:

time_range = (Time.now - 10.days)..Time.now 

    @items = Item.joins("left join impressions on impressions.impressionable_id = items.id and impressions.impressionable_type = 'Item'") 
    .select("count(distinct(ip_address)) as counter, impressionable_id, items.title, items.id, items.image") 
    .where('impressions.created_at' => time_range) 
    .group('items.id') 
    .order("counter desc") 
    .page(params[:page]) 
    .per_page(9) 

然而,這排除了沒有意見,這不是我想要的物品。這些應該用0視圖表示。

任何建議如何解決這個問題?

+0

'連接'將消除沒有關係的記錄,而是使用'includes(:impressions)'。看到這裏:http://hiteshrawal.blogspot.ca/2011/12/rails-include-vs-joins.html,它說:「':連接」 - 它實際上做一個'INNER JOIN',它過濾行沒有關聯。「 &「':includes'它將執行'LEFT OUTER JOIN',它顯示錶中的所有記錄。」 – MrYoshiji

回答

0

我必須使用CASE,以及一些修改,以使其在heroku的postgres服務器上運行。

start_date = (Time.now - 10.days) 
    end_date = Time.now 
    joins("left join impressions on impressions.impressionable_id = items.id and impressions.impressionable_type = 'Item'") 
     .select("count(distinct(case when (impressions.created_at BETWEEN '#{start_date}' AND '#{end_date}') then ip_address end)) as counter, impressionable_id, items.gender, items.title, items.id, items.image") 
     .group('items.id', 'impressions.impressionable_id') 
     .order("counter desc")