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