我尝试从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
?