【发布时间】:2015-04-04 10:52:31
【问题描述】:
我正在处理这个“heavy_rotation”过滤器。基本上,它会根据某些参数(例如,listen_count、staff_pick、purchase_count 等)从我们的数据库中抓取曲目
向 filter_tracks 控制器操作发出 xhr 请求。在那里我有一个标志来检查它是否是“heavy_rotation”。我可能会将其移至模型中(因为此控制器越来越胖)...无论如何,我如何确保(以有效的方式)不让它拉出相同的记录?我已经考虑过偏移量,但我必须跟踪每个查询的偏移量。或者也许存储 track.id 以针对每个查询进行比较?有任何想法吗?我很难想出一种优雅的方式来做到这一点。
也许需要注意的是,通过 Javascript 设置了 14 个限制,当用户点击“查看更多”进行分页时,它会向 filter_tracks 发送另一个请求。
任何帮助表示赞赏!谢谢!
def filter_tracks
params[:limit] ||= 50
params[:offset] ||= 0
params[:order] ||= 'heavy_rotation'
# heavy rotation filter flag
heavy_rotation ||= (params[:order] == 'heavy_rotation')
@result_offset = params[:offset]
@tracks = Track.ready.with_artist
params[:order] = "tracks.#{params[:order]}" unless heavy_rotation
if params[:order]
order = params[:order]
order.match(/artist.*/){|m|
params[:order] = params[:order].sub /tracks\./, ''
}
order.match(/title.*/){|m|
params[:order] = params[:order].sub /tracks.(title)(.*)/i, 'LOWER(\1)\2'
}
end
searched = params[:q] && params[:q][:search].present?
@tracks = parse_params(params[:q], @tracks)
@tracks = @tracks.offset(params[:offset])
@result_count = @tracks.count
@tracks = @tracks.order(params[:order], 'tracks.updated_at DESC').limit(params[:limit]) unless heavy_rotation
# structure heavy rotation results
if heavy_rotation
puts "*" * 300
week_ago = Time.now - 7.days
two_weeks_ago = Time.now - 14.days
three_months_ago = Time.now - 3.months
# mix in top licensed tracks within last 3 months
t = Track.top_licensed
tracks_top_licensed = t.where(
"tracks.updated_at >= :top",
top: three_months_ago).limit(5)
# mix top listened to tracks within last two weeks
tracks_top_listens = @tracks.order('tracks.listens_count DESC').where(
"tracks.updated_at >= :top",
top: two_weeks_ago)
.limit(3)
# mix top downloaded tracks within last two weeks
tracks_top_downloaded = @tracks.order("tracks.downloads_count DESC").where(
"tracks.updated_at >= :top",
top: two_weeks_ago)
.limit(2)
# mix in 25% of staff picks added within 3 months
tracks_staff_picks = Track.ready.staff_picks.
includes(:artist).order("tracks.created_at DESC").where(
"tracks.updated_at >= :top",
top: three_months_ago)
.limit(4)
@tracks = tracks_top_licensed + tracks_top_listens + tracks_top_downloaded + tracks_staff_picks
end
render partial: "shared/results"
end
【问题讨论】:
标签: ruby-on-rails ruby sorting activerecord filtering