我有这个活动记录集合,并在视图中的可排序表中使用它。我希望表格显示最近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)
答案 0 :(得分:0)
我建议使用查询从数据库中获取50个最新视频。而不是按内存中的这些属性来命令它们。不要在同一个SQL查询中同时执行这两项操作。
要执行此操作,请使用@videoes
将to_a
隐藏到数组,或直接使用sort
,因为order
会添加另一个order by
在查询中并弄乱你的结果。