2013-07-03 3 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

«joins» будет исключать записи, не имеющие отношения, вместо этого используйте 'include (: impressions)'. См. Здесь: http://hiteshrawal.blogspot.ca/2011/12/rails-include-vs-joins.html, он говорит: «': joins' - На самом деле это делает «INNER JOIN», который фильтрует строки, которые не имеют ассоциации ». & "': includes' будет делать "LEFT OUTER JOIN", который показывает всю запись из таблицы. " – MrYoshiji

ответ

0

Мне пришлось использовать CASE, а также некоторые изменения, чтобы он запускался на сервере 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") 
Смежные вопросы