Ruby on rails Rails哈希键/值在本地和heroku中创建的方式不同
我昨晚很晚才遇到这个问题,我刚刚知道发生了什么,但我想知道为什么。我在本地(使用sqlite)测试了我的代码,它运行得很好,但是当我部署到heroku(postgres)时,一个汇总表并没有显示正确的结果。摘要数据是从一个散列中检索的,该散列是通过查询活动记录创建的,先转换为行,然后转换为散列,最后生成一个键、值对散列,我们称之为@assignments。用于创建该结果的方法如下所示:Ruby on rails Rails哈希键/值在本地和heroku中创建的方式不同,ruby-on-rails,postgresql,sqlite,heroku,hash,Ruby On Rails,Postgresql,Sqlite,Heroku,Hash,我昨晚很晚才遇到这个问题,我刚刚知道发生了什么,但我想知道为什么。我在本地(使用sqlite)测试了我的代码,它运行得很好,但是当我部署到heroku(postgres)时,一个汇总表并没有显示正确的结果。摘要数据是从一个散列中检索的,该散列是通过查询活动记录创建的,先转换为行,然后转换为散列,最后生成一个键、值对散列,我们称之为@assignments。用于创建该结果的方法如下所示: def summarize_hrs(date,userid) @query = "SELECT id
def summarize_hrs(date,userid)
@query = "SELECT id, (coalesce(hrs1,0) + coalesce(hrs2,0) + coalesce(hrs3,0)) as hrs
FROM
((
(
jobs
left outer join
(SELECT job1, sum(coalesce(hrs1,0)) as hrs1 FROM schedules WHERE date = '" + date.to_s + "' and job1 is not null and user_id =" + userid.to_s + " group by job1) s1
on jobs.id = s1.job1
) sum1
left outer join
(SELECT job2, sum(coalesce(hrs2,0)) as hrs2 FROM schedules WHERE date = '" + date.to_s + "' and job2 is not null and user_id =" + userid.to_s + " group by job2) s2
on sum1.id = s2.job2) sum2
left outer join
(SELECT job3, sum(coalesce(hrs3,0)) as hrs3 FROM schedules WHERE date = '" + date.to_s + "' and job3 is not null and user_id =" + userid.to_s + " group by job3) s3
on sum2.id = s3.job3)"
@assignments = Hash[Schedule.connection.select_all(@query).rows]
return @assignments
end
作为一个故障排除步骤,我开始将@assignment内容打印到屏幕上,结果如下:
本地(sqlite):{1=>0,2=>0,3=>9.0,4=>0,5=>0}
prod(heroku):{“1”=>“11”,“2”=>“7”,“3”=>“0”,“4”=>“7”}
结果针对不同的用户,因此他们不会匹配;然而有趣的是,heroku散列有“”,而本地散列没有。为什么会这样,在查询/转换中是否有我做错了什么
在此期间,我已通过强制我的prod键为字符串(如下所示)来修复此问题,但这会破坏我的本地设置。任何帮助都将不胜感激
</tr>
<% @total_planned = 0 %>
<% @jobs.each do |job| %>
<% @search = "Select "+ @col+" FROM schedule_plans where job_id= "+job.id.to_s+" and user_id = "+@userid.to_s
@scheduled_hrs = SchedulePlan.connection.select_value(@search).to_f %>
<tr>
<% if (@scheduled_hrs > 0) %>
<% @total_planned = @total_planned + @scheduled_hrs %>
<% @assigned_hrs = @assignments[job.id.to_s].to_f %>
<td> <%= job.name %> </td>
<td> <%= @assigned_hrs %> </td>
<td> <%= @scheduled_hrs %> </td>
<td class = "variance" > <%= @scheduled_hrs - @assigned_hrs%></td>
<%end%>
</tr>
0) %>
这似乎是pg
Gem和底层libpq
驱动程序处理键入的方式与SQLite驱动程序的不同,这是由于驱动程序开发人员有意决定将类型转换留给应用程序框架,并将所有内容作为字符串返回。通过执行原始SQL并直接从Result.rows
到Hash
将ActiveRecord中的逻辑传递给映射类型,从而获得驱动程序选择的类型
见:
pg
Gem和底层libpq
驱动程序处理类型与SQLite驱动程序的不同之处,这是由于驱动程序开发人员有意决定将类型转换留给应用程序框架,并将所有内容作为字符串返回。通过执行原始SQL并直接从Result.rows
到Hash
将ActiveRecord中的逻辑传递给映射类型,从而获得驱动程序选择的类型
见:
@assignments=rst.rows.collect{k,v{k.to_I=>v.to_I}
其中rst
是来自Schedule.connection的结果。选择所有(@query)
。它增加了一个额外的步骤,但它应该可以跨sqlite和PostgreSQL工作。不过,我的建议是研究在开发中使用PostgreSQL,以避免其他类似的问题。我最终通过创建一个SQL视图来解决这个问题,在不影响类型的情况下总结数据。谢谢,这很有意义。对于如何不绕过ActiveRecord逻辑映射类型,您有什么想法吗?AciveRecordResult.to_散列返回的内容与我所要查找的内容不同,因为它包含列名作为键。对此我没有直接的答案(我对Rails的了解相当薄弱)。我想到的是这样的:@assignments=rst.rows.collect{k,v{k.to_I=>v.to_I}
其中rst
是来自Schedule.connection的结果。选择所有(@query)
。它增加了一个额外的步骤,但它应该可以跨sqlite和PostgreSQL工作。不过,我的建议是研究在开发中使用PostgreSQL,以避免其他类似的问题。我最终通过创建一个SQL视图来解决这个问题,在不影响类型的情况下总结数据。谢谢,这很有意义。对于如何不绕过ActiveRecord逻辑映射类型,您有什么想法吗?AciveRecordResult.to_散列返回的内容与我所要查找的内容不同,因为它包含列名作为键。对此我没有直接的答案(我对Rails的了解相当薄弱)。我想到的是这样的:@assignments=rst.rows.collect{k,v{k.to_I=>v.to_I}
其中rst
是来自Schedule.connection的结果。选择所有(@query)
。它增加了一个额外的步骤,但它应该可以跨sqlite和PostgreSQL工作。不过,我的建议是研究在开发中使用PostgreSQL,以避免其他类似的问题。我最终通过创建一个SQL视图来解决这一问题,在不影响类型转换的情况下汇总数据