Getting typed results from ActiveRecord raw SQL

后端 未结 6 2037
Happy的楠姐
Happy的楠姐 2020-12-29 20:51

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 so

6条回答
  •  长情又很酷
    2020-12-29 21:13

    Pretty ugly but does what you are asking for:

    res = ActiveRecord::Base.connection.
    select_all("select 1 as aa, false as aas, 123::varchar, Array[1,2] as xx")
    
    # Breaks unless returned values have unique column names
    res.map{|row|row.map{|col,val|res.column_types[col].type_cast val}}
    
    # Don't care about no column names
    res.map{|row|
      row.values.map.with_index{|val,idx|
        res.column_types.values[idx].type_cast val
      }
    }
    

    gives:

    [[1, false, "123", [1, 2]]]
    

    How it works:

    res.column_types
    

    returns a hash of columns names and Postgresql column types

    Here is a pointer to how it works: https://github.com/rails/docrails/blob/fb8ac4f7b8487e4bb5c241dc0ba74da30f21ce9f/activerecord/lib/active_record/connection_adapters/postgresql/oid/float.rb

提交回复
热议问题