module JamRuby class Feed < ActiveRecord::Base belongs_to :recording, class_name: "JamRuby::Recording", inverse_of: :feed, foreign_key: 'recording_id' belongs_to :music_session_history, class_name: "JamRuby::MusicSessionHistory", inverse_of: :feed, foreign_key: 'music_session_id' FIXNUM_MAX = (2**(0.size * 8 -2) -1) SORT_TYPES = ['date', 'plays', 'likes'] def self.index(params = {limit:20, sort: 'date'}) limit = params[:limit] limit ||= 20 # validate sort sort = params[:sort] sort ||= 'date' raise "not valid sort #{sort}" unless SORT_TYPES.include?(sort) start = params[:start] if sort == 'date' start ||= FIXNUM_MAX else start ||= 0 end query = Feed.includes([:recording]).includes([:music_session_history]).limit(limit) if sort == 'date' query = query.where("id < #{start}") query = query.order('id DESC') elsif sort == 'plays' query = query.offset(start) query = query.order("COALESCE(recordings.play_count, music_sessions_history.play_count) DESC ") elsif sort == 'likes' query = query.offset(start) query = query.order("COALESCE(recordings.like_count, music_sessions_history.like_count) DESC ") else raise "sort not implemented: #{sort}" end #query = query.order('claimed_recordings.created_at') if query.length == 0 [query, nil] elsif query.length < limit [query, nil] else if sort == 'date' [query, query.last.id] else [query, start + limit] end end end end end