使用Postgres变量用法进行Rails查询

时间:2015-05-08 01:44:56

标签: ruby-on-rails postgresql

我正在尝试创建一个重用变量的Rails Postgres查询。

视频有很多活动(想想统计数据)。每个活动记录观看的视频和观看的视频进度(0-100)%

要生成可以分页的视频报告表,我需要查询以获取所有视频观看活动以及每个视频获取 a)总共有多少观点 b)有多少观点的进度(整数)大于或等于90% c)计算观看率超过90%的人的百分比,例如(B / A)×100

下面的代码大致是它应该如何工作(真实代码和sudo代码的组合)

  Video.joins(:activities)
       .where('occurred_at >= ? AND occurred_at <= ?', @start_time, @end_time)
       .select('videos.*, COUNT(activities.id) as total_views, COUNT(activities.progress >= 90) as completed_views, case when total_views = 0 then 0.0 else ROUND( 100.0 *(completion_views/ cast(total_views as float)) ) end as percent_completed')
       .group('videos.id')
       .page(@page).per(@per_page)

如何在select查询中重用total_views和completed_views变量来创建percent_completed变量并使它们查询工作。我也意识到计算COUNT(activities.progress >= 90) as completed_views也不正确,我不知道该怎么做。

1 个答案:

答案 0 :(得分:1)

您需要在子查询中使用上述查询。

subquery = Video.joins(:activities)
     .where('occurred_at >= ? AND occurred_at <= ?', @start_time, @end_time)
     .select('videos.*, COUNT(activities.id) as total_views, COUNT(activities.progress >= 90) as completed_views')
     .group('videos.id').as('videos')

Video
  .select('videos.*, case when total_views = 0 then 0.0 else ROUND( 100.0 *(completion_views/ cast(total_views as float)) ) end as percent_completed')
  .from(subquery).page(@page).per(@per_page)

(我只是使用您在上面提供的伪代码,但总体思路是可靠的。)