2016-04-20 3 views
1

Мне нужно отсортировать записи в моей таблице в Rails 4 по значениям в столбце Points моей модели.Как суммировать значения по общему атрибуту перед сортировкой в ​​Rails

Эта часть проста, но у меня есть дополнительная сложность: я хочу использовать. sum для всех значений с совпадением user_id до этого. Другими словами, я хочу получить .order общие точки, принадлежащие пользователю, которые могут включать в себя несколько значений.

Во-первых, для получения общего порядка, я попробовал:

@orders = Point.order(points: :desc) 
@total = @orders.sum(:points) 

Это создает общую сумму значений в этой таблице. Тем не менее, я вместо этого хочу использовать .sum, чтобы добавить значения с совпадением user_id перед выполнением @orders.

Чтобы быть более понятным, вот что выглядит таблица Points.rb.

Points.rb Пример таблицы

|user_id: 1| points: 10 | game_id 3| 
|user_id: 1| points: 20 | game_id 2| 
|user_id: 2| points: 50 | game_id 3| 
|user_id: 3| points: -10 | game_id 1| 

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

+0

Попробуйте User.points.sum (: баллы), Напишите ваше отображение пользователя & вт в точку для более разъяснений –

+0

я удалил свой код выше и попытался запустить ваш. Я получаю 'undefined method' points ''error для User.points.sum (: points). Я также должен отметить, что Пользователь имеет отношение has_many к Points, что заставило меня думать, что это сработает. Пока не повезло. – darkginger

ответ

1

Вы можете попробовать следующий запрос:

Point.order(points: :desc).group(:user_id).sum(:points) 
#=> {2 => 50, 1 => 30, 3 => -10} 

Этот код дает SQL следующий запрос:.

SELECT SUM (pointspoints) AS sum_points, user_id AS user_id FROM points ГРУППА BY points. user_id ЗАКАЗАТЬ НА points. points DESC

+0

Тестирование сейчас. Логика вашего предложения имеет смысл для меня, но я продолжаю видеть «неопределенный метод« точки »для [nil, 300]: Array'. Для меня это не имеет смысла, так как группа должна идеально заполнить первое значение целым числом, представляющим user_id. Попытка отладки сейчас. – darkginger

+0

Я также должен добавить для справки, что я пытаюсь выполнить итерацию через все user_ids с их сгруппированными точками в моем представлении так: '<% @ points.each do | point | %> <% = точка.Точки%> <% = point.user_id%> <% end %> ' – darkginger

+0

Я думаю, вам нужно установить 0 в качестве значения по умолчанию для точек в базе данных. – Ilya

-2

Я предполагаю, что пользователь имеет много точек & ваша таблица точек содержит столбец с именем «точка», так что ваш код контроллера должен быть похож ниже:

@user = User.all 
@user.each do |u| 
    puts u.points.sum(:point) 
end 
+0

Я просто пробовал это в своей системе и работает, я не понимаю, кто проголосовал за этот ответ –

+0

Я думаю, проблема в том, что автор хочет сделать это с SQL-запросом. – Ilya

+0

@llya: в соответствии с вопросом, кажется, что автор хочет получить код rails code & not sql –

Смежные вопросы