活动记录仅对最后x个记录执行顺序

时间:2015-04-17 23:39:37

标签: sql ruby-on-rails postgresql activerecord

我有这个活动记录集合,并在视图中的可排序表中使用它。我希望表格显示最近50个视频,我想仅对最后50个视频执行排序(created_at,response_count,watched_count),但是当我传入参数进行排序时,它会从整个集合中重新选择视频,然后订购后最后50。

基本上我想知道 - 我怎么能先拍摄最近的50个视频,然后按这些属性排序,而不是先订购然后再拍50个。

即使我把.order子句单独执行并且单独执行,活动记录仍然将@videos视为一个大的SQL查询并将所有内容组合在一起。

@videos = Video.select("videos.*,
                            COALESCE(SUM(video_activities.video_watched_count),0) AS watched_count,
                            COALESCE(SUM(video_activities.response_count),0) AS response_count,
                            COALESCE(SUM(video_activities.email_opened_count),0) AS email_opened_count,
                            MAX(video_activities.updated_at) AS last_activity")
                    .joins("INNER JOIN customers ON videos.customer_id = customers.id AND customers.id = #{current_customer.id}
                            LEFT JOIN video_activities ON videos.id = video_activities.video_id
                            LEFT JOIN people on videos.person_id = people.id")
                    .where.not(videos: {template: true})
                    .order("#{sort} #{params[:direction]}  NULLS LAST")
                    .group("#{group_by}")
                    .limit(50)

1 个答案:

答案 0 :(得分:0)

我建议使用查询从数据库中获取50个最新视频。而不是按内存中的这些属性来命令它们。不要在同一个SQL查询中同时执行这两项操作。

要执行此操作,请使用@videoesto_a隐藏到数组,或直接使用sort,因为order会添加另一个order by在查询中并弄乱你的结果。