i have activerecord model event want order rank. rank sum of weighted properties. instance might want rank event logic like:
log(number of followers) + (7 - number of days now) the following works, not satisfactory because returns result set instead of relation object. therefore won't able treat scope. (fyi using postgres postgis extension)
x = event.find_by_sql(" select ( case when count(follows.*) = 0 0 else log(count(follows.*)) end + sign(7 - (extract(epoch start) - extract(epoch now())) / 86400) * log(abs(7 - (extract(epoch start) - extract(epoch now())) / 86400)) ) score, events.* events left outer join follows on events.id = follows.followable_id , follows.followable_type = 'event' , follows.blocked = 'f' (events.start > now()) , (st_dwithin(st_setsrid(st_point(#{@location[:lng]}, #{@location[:lat]}), 4326), st_transform(loc, 4326), 48280.2, true)) group events.id order 1 desc ") i understand add counter cache events table , avoid join, in future want compute rank through other association helpful know how.
thanks
this pretty easy split activerecord::relation queries.
x = event.select("( case when count(follows.*) = 0 0 else log(count(follows.*)) end + sign(7 - (extract(epoch start) - extract(epoch now())) / 86400) * log(abs(7 - (extract(epoch start) - extract(epoch now())) / 86400)) ) score, events.*") x = x.joins("left outer join follows on events.id = follows.followable_id , follows.followable_type = 'event' , follows.blocked = 'f'") x = x.where("(events.start > now()) , (st_dwithin(st_setsrid(st_point(#{@location[:lng]}, #{@location[:lat]}), 4326), st_transform(loc, 4326), 48280.2, true))") x = x.group('events.id') x = x.order('1 desc') of course, recommend splitting these in various scopes, should @ least in right direction.
Comments
Post a Comment