Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Getting typed results from ActiveRecord raw SQL

In Sequel, I can do:

irb(main):003:0> DB["select false"].get => false 

Which returns a false boolean. I'd like to be able to do something similar in ActiveRecord:

irb(main):007:0> ActiveRecord::Base.connection.select_value "select false" => "f" 

As you can see, it returns the string "f". Is there a way to get a false boolean with ActiveRecord? (Similarly, I might be calling a function that returns a timestamptz, an array, etc -- I'd want the returned value to have the correct type)

My use case: I'm calling a database function, want to get back a typed result instead of a string.

like image 467
Joe Van Dyk Avatar asked Aug 15 '14 18:08

Joe Van Dyk


1 Answers

While I have no doubt that Björn Nilsson's answer worked when he posted it, it is failing for me with Postgres 9.4 and PG gem version 0.18.2. I have found the following to work after looking through the PG gem documentation:

pg = ActiveRecord::Base.connection @type_map ||= PG::BasicTypeMapForResults.new(pg.raw_connection)  res = pg.execute("SELECT 'abc'::TEXT AS a, 123::INTEGER AS b, 1.23::FLOAT;") res.type_map = @type_map res[0] # => {"a"=>"abc", "b"=>123, "float8"=>1.23} 
like image 194
Ramfjord Avatar answered Oct 01 '22 11:10

Ramfjord