2016-05-04 2 views
0

У меня есть модель Game с атрибутом points, и я хочу вычислить сумму из 20 лучших результатов.Расчеты ActiveRecord на подмножествах или записях

я могу срывать точки и рубин вычислить сумму, как в:

Game.order('points desc').limit(20).pluck(:points).sum 

Но я любопытно, есть ли простой способ иметь AR произвести расчет SQL совокупного для выполнения того же , Следующая наивная попытка не работает:

Game.sum(:points, order: 'points desc', limit: 20) 
SELECT SUM(`games`.`points`) FROM `games` 

Благодаря

ответ

0

Я собираюсь ответить на мой собственный вопрос, но с удовольствием награждает лучшее решение.

Функция sum действительно принимает только один аргумент, а в то время как AR 4.x используется для простого игнорирования каких-либо дополнительных аргументов, новый AR 5.0.0 вызывает ошибку. Первоначальная попытка была действительно наивной.

По предложению @pitabas', я тогда попробовал:

Game.order('points desc').limit(20).sum(:points) 
SELECT SUM("games"."points") FROM "games" LIMIT ? [["LIMIT", 20]] 

Как вы можете сказать, из SQL, построенной AR, это не работает, либо, потому что положение LIMIT действует на результат запроса, который является единственным значением. Кроме того, предложение ORDER игнорируется вообще. Результатом вышеуказанного выражения является общая сумма столбца точек для всех записей.

запрос SQL, который на самом деле работает что-то вроде:

SELECT SUM(points) FROM (SELECT points FROM games ORDER BY points DESC LIMIT 20) 

Ближайший я получил это следующее:

sq = Game.order('points desc').limit(20) 
Game.from(sq).sum('"points"') 

, который дает:

SELECT SUM("points") FROM (SELECT "games".* FROM "games" ORDER BY points desc LIMIT ?) subquery [["LIMIT", 20]] 

Hack: обратите внимание на двойной набор котировок вокруг points. Вот как мне удалось обеспечить буквальную интерпретацию аргумента sum. Без них в запросе возникает ошибка «нет такого столбца».

+0

Вчера я спросил о том же вопросе http://stackoverflow.com/questions/43955310/rails-sum-on-associationrelation-attribute-is-incorrect-if-association-has-limit. Даже попытка «из» не работает в рельсах 5, по крайней мере, с отношением или PG. Угадайте, что нет ответа, просто используйте 'relation.pluck (attr) .sum' – appleII717

2

Попробуйте это:

Game.order('points desc').limit(20).sum(:points) 
+0

не работает, так как оба ORDER и LIMIT игнорируются – Giuseppe

+0

он работает на моей консоли вы можете опубликовать сообщение об ошибке, что вы получите после того, как выполнить это –

+0

смотрите мой собственный ответ – Giuseppe

0

предел() не в ответе выше

Game.order('point desc').limit(2).pluck(:point).inject(:+)

+0

Это равносильно тому, что я написал, и он не отвечает вопрос, поскольку он использует ruby ​​для выполнения расчета. – Giuseppe

-1

ли к сведению что нет смысла упорядочивать результаты, если вы заинтересованы только в compu тины сумма, следовательно, то ответ ниже будет достаточно

Game.limit (10) .sum (: баллы)

+0

Внимательно прочитайте вопрос! затем ответьте ... –

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