Вы можете передать необработанный SQL в #select
, чтобы выбрать динамические / расчетные значения. Не проверено, но посмотрите, работает ли что-то подобное:
tasks = Task
.select('id, (SELECT SUM(s) FROM UNNEST(priorities) s) AS temp_sum')
.order(temp_sum: :desc)
# tasks.first.id => the Task ID
# tasks.first.temp_sum => the SQL-calculated value
Postgres по умолчанию имеет значение null, поэтому NULLS LAST
не является строго обязательным. Хотя, конечно, вы могли бы сохранить его, если хотите быть полностью явным: .order('temp_sum DESC NULLS LAST')
.
Это не проблема для этого точного варианта использования, поскольку вы не передаете никаких введенных пользователем значений, но просто как общее предупреждение: всегда будьте осторожны с SQL уязвимостями при внедрении при передаче в raw SQL! Потому что Rails не сможет выполнить все свои входные санирующие маги c, когда вы просто передадите необработанные строки.