У меня есть метод ранжирования ответов пользователей в нашей системе, который называется ranked_users
def ranked_users
User.joins(:responds).group(:id).select(
"users.*, SUM(CASE WHEN answers.response != 3 THEN 1 ELSE 0 END ) avg, RANK () OVER (
ORDER BY SUM(CASE WHEN answers.response != 3 THEN 1 ELSE 0 END ) DESC, CASE WHEN users.id = '#{
current_user.id
}' THEN 1 ELSE 0 END DESC
) rank"
)
.where('users.active = true')
.where('answers.created_at BETWEEN ? AND ?', Time.now - 12.months, Time.now)
end
result = ranked_users
. Затем я беру первые три с top_3 = ranked_users.limit(3)
Если пользователь не входит в тройку лидеров, я хочу добавить его с его рангом в список: user_rank = result.find_by(id: current_user.id)
Всякий раз, когда я звоню user_rank.rank
, он возвращает 1. Я знаю, что это потому, что это сначала применяя предложение find_by, а затем ранжируя их. Есть ли способ обеспечить выполнение предложения find_by только по результату первого запроса? Я пытался сделать result.load.find_by(...)
, но у меня была та же проблема. Я мог бы преобразовать весь результат в массив, но я хочу, чтобы решение было легко масштабируемым.