0

私のアプリケーションでは、過去 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 ビューで表す必要があります。

この問題を解決する方法について何か提案はありますか?

4

1 に答える 1

0

Heroku の postgres サーバーで実行するには、CASE といくつかの変更を加える必要がありました。

  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")
于 2013-07-06T08:56:53.820 に答える