Драйвер Rails PostgreSQL понимает, что логические значения PostgreSQL имеют вид 't'
и 'f'
и обычно переводит их правильно.Ваш CAST:
CAST(coalesce(user_training_courses.id, 0) as BOOLEAN)
также должен быть в порядке:
psql=> select cast(11 as boolean), cast(1 as boolean), cast(0 as boolean);
bool | bool | bool
------+------+------
t | t | f
Так что я предполагаю, что Rails просто не знает тип столбца вашего CAST.Например:
rails > ActiveRecord::Base.connection.select_rows('select cast(1 as boolean), 11 = 11')
=> [["t", "t"]]
Вы можете самостоятельно преобразовать 't'
и 'f'
в логические значения, используя константы Set в ActiveRecord::ConnectionAdapters::Column
:
TRUE_VALUES = [true, 1, '1', 't', 'T', 'true', 'TRUE'].to_set
FALSE_VALUES = [false, 0, '0', 'f', 'F', 'false', 'FALSE'].to_set
или вы можете использовать ActiveRecord::ConnectionAdapters::Column.value_to_boolean
:
rails > ActiveRecord::Base.connection.select_rows('select cast(1 as boolean), 11 = 11').map { |r| r.map { |b| ActiveRecord::ConnectionAdapters::Column.value_to_boolean(b) } }
=> [[true, true]]
Но вам все равно придется знать, к каким типам относятся все ваши столбцы, и разобраться во всем, если вы собираетесь использовать низкоуровневый интерфейс SQL.Аналогичные проблемы относятся к целым числам, датам и любым другим не строковым типам, которые вы возвращаете.