ActiveRecord条件计数

时间:2013-07-03 17:25:54

标签: sql ruby-on-rails activerecord

在我的应用程序中,我正在尝试在过去10天内按视图对项目进行排序。我正在使用Impressionist gem,它创建一个名为impression的模型并在此处记录每个视图。

我设法得到了这段代码:

@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视图表示。

有关如何解决此问题的任何建议吗?

1 个答案:

答案 0 :(得分: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")