Я переношу базу данных из mysql в postgres. Сама миграция была в порядке, следуя документации postgres.
В настоящее время я исправляю наши специфические запросы mysql.
В какой-то момент у нас есть что-то вроде этого:
select(%(
SUM(CASE WHEN income THEN value ELSE 0 END) AS rents,
SUM(CASE WHEN not income THEN value ELSE 0 END) AS expenses
))
В mysql это был sum(if(incomes, value, 0))
и т.д., и он работал как ожидалось.
С PG он возвращает строку вместо числового.
Я уже проверил базу данных и правильный тип данных.
Что делать, кроме литых to_d
или to_f
?
EDIT: полный запрос:
SELECT
SUM(CASE WHEN income THEN value ELSE 0 END) AS rents,
SUM(CASE WHEN not income THEN value ELSE 0 END) AS expenses
FROM "transactions"
WHERE "transactions"."type" IN ('Transaction')
AND "transactions"."user_id" = 1
AND "transactions"."paid" = 't'
AND (transactions.date between '2013-09-01' and '2013-09-30')
LIMIT 1
Насколько я знаю, используя .to_f
, .to_i
или что-то в этом роде - адаптер Rails PostGres кажется непреклоненным, что все это строка, если она не является моделью ActiveRecord.
Смотрите: connection.select_value возвращает строки только в postgres с pg gem
Я не особо одобряю это, но, как говорится, "работает по назначению".
Model.select(...).each { |m| def mx; attributes['x'].to_i; end }
при желании.
value
?Model.select('1 as x').first.x.class
тоже говорит оString
.