ActiveRecord и операторы SELECT AS SQL - PullRequest
1 голос
/ 16 мая 2009

Я разрабатываю в Rails приложение, в котором я хотел бы ранжировать список пользователей на основе их текущих баллов. Таблица выглядит следующим образом: user_id: string, points: integer. Так как я не могу понять, как это сделать "Путем Rails", я написал следующий код SQL:

self.find_by_sql ['SELECT t1.user_id, t1.points, COUNT(t2.points) as user_rank FROM registrations as t1, registrations as t2 WHERE t1.points <= t2.points OR (t1.points = t2.points AND t1.user_id = t2.user_id) GROUP BY t1.user_id, t1.points ORDER BY t1.points DESC, t1.user_id DESC']

Дело в том, что единственный способ получить доступ к псевдониму столбца "user_rank" - это ранжировать [0] .user_rank, что доставляет мне много головной боли, если я хочу легко отобразить полученную таблицу.

Есть ли лучший вариант?

Ответы [ 3 ]

1 голос
/ 08 июня 2009

как насчет:

@ranked_users = User.all :order => 'users.points'

тогда, по вашему мнению, вы можете сказать

<% @ranked_users.each_with_index do |user, index| %>
  <%= "User ##{index}, #{user.name} with #{user.points} points %>
<% end %>

если по какой-то причине вам необходимо сохранить этот числовой индекс в базе данных, вам необходимо добавить обратный вызов after_save, чтобы обновлять полный список пользователей всякий раз, когда число точек у каждого изменяется. Вы можете использовать плагин acts_as_list, чтобы помочь с этим, или это может быть полным перебором.

0 голосов
/ 16 мая 2009

Что, если вы сделали:

SELECT t1.user_id, COUNT(t1.points) 
FROM registrations t1 
GROUP BY t1.user_id 
ORDER BY COUNT(t1.points) DESC

Если вы хотите получить все рельсы, тогда сделайте

cool_users = self.find_by_sql ['(sql above)']

cool_users.each do |cool_user|
  puts "#{cool_user[0]} scores #{cool_user[1]}"
end
0 голосов
/ 16 мая 2009

Попробуйте добавить user_rank к вашей модели.

class User < ActiveRecord::Base

  def rank
   #determine rank based on self.points (switch statement returning a rank name?)
  end

end

Затем вы можете получить к нему доступ через @ user.rank.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...