我正在寻找使用Active Record查询以下查询结果的说明:
date_range = (Date.today - 7)..(Time.now.to_datetime)
r = Report.find(:all, :conditions => {:created_at => date_range},
:group => 'date(created_at)',
:select => 'date(created_at) as day, count(id) as counter')
基本上我只是计算表格“报告”中的结果,但我得到了命名字段“counter”的不同类型的值,双引号字符串数组与仅数字数组。
如果使用MySQL,
r.map(&:counter)
返回:
的 => [“3”,“3”,“5”,“4”,“4”]
如果使用SQLite,
r.map(&:counter)
返回:
的 => [3,3,5,4,4]
MySQL返回带引号(字符串)和SQLite数字的数字是否正确? 我预计两者都会返回整数。或者我在MySQL端错过了一些配置?
修改
以防万一,这两个DB都是使用正常迁移创建的,因此所有字段都是等效类型。
答案 0 :(得分:1)
这是SQLite ActiveRecord适配器中的错误。
使用“SELECT expr AS col_name”合成新列值时,col_name将转换为String而不是正确的数据类型(在本例中为int)。
显然,SQLite无法为视图返回正确的列类型值,这是在合成这样的属性时使用的机制。
答案 1 :(得分:0)
我使用底层连接执行我的SQL语句时遇到了同样的问题。
但是,我注意到,如果在exec_sql语句中使用绑定,则数据类型会按预期返回。
E.g。
ActiveRecord::Base.connection.exec_sql("select * from users where id = 35")
结果
ActiveRecord :: Result:0x7fa2c6ede200 @columns = [“id”,“name”],@ hash_rows = nil,@rows = [[“35”,“FOO”]]
然而,
ActiveRecord::Base.connection.exec_sql("select * from users where id = ?", nil, [[nil,35]])
结果
ActiveRecord ::结果:0x7fa2c6ede200 @columns = [“id”,“name”], @ hash_rows = nil,@于= [[35,“FOO”]]
请注意,数据类型为35是整数! 希望有所帮助。