ActiveRecord ::从mysql支持的`.select_all`返回的结果没有类型信息

时间:2017-11-13 11:11:17

标签: mysql ruby-on-rails activerecord

我尝试从ActiveRecord::Base.connection.select_all输入结果,但输入信息似乎是空的。根据此Stackoverflow Post,至少在使用postgres适配器时,类型信息可以由result.column_types派生。但是当我使用mysql适配器运行相同的代码时,我什么都没有返回。

result = ActiveRecord::Base.connection.select_all(User.all.to_sql)
result.column_types #=> returns {} 
result.cast_value #=> returns uncasted values

我知道有类似的东西可以投射东西,

User.type_for_attribute('id').deserialize('100')
# => 100

但是当使用ActiveRecord :: Result时,这不会很好用,因为我们不知道哪个列属于哪个ActiveRecord类(至少从结果中)。

**问题1.是否有任何简单的方法可以在ActiveRecord :: Result上实现类型转换?

我跟着源代码了一下,看起来mysql适配器在初始化Result对象时没有传递类型信息。下面是ActiveRecord :: Result的初始化方式(gh code),

module ActiveRecord
  class Result
    def initialize(columns, rows, column_types = {})
       @columns      = columns
       @rows         = rows
       @hash_rows    = nil
       @column_types = column_types
    end
    ...

这里ActiveRecord's mysql adapter code你可以看到它没有传递任何东西作为第三个参数,而postgres code does

所以我猜猜mysql的类型转换是在其他地方完成的。

问题2.任何人都知道mysql的魔力在哪里以及正常的ActiveRecord用法如User.first.id

0 个答案:

没有答案