как перевести этот PostgreSQL запрос в activerecord - PullRequest
0 голосов
/ 29 февраля 2020

SELECT id, (ВЫБЕРИТЕ СУМЫ (s) ИЗ UNNEST (инвестировано) s) как временные интервалы. ПОРЯДОК ПО ТЕМП. DES C NULLS LAST;

1 Ответ

0 голосов
/ 29 февраля 2020

Вы можете передать необработанный 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, когда вы просто передадите необработанные строки.

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