ruby on rails 3 - ActiveRecord query too difficult for my tiny brain -


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