Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/59.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails Rails哈希键/值在本地和heroku中创建的方式不同_Ruby On Rails_Postgresql_Sqlite_Heroku_Hash - Fatal编程技术网

Ruby on rails Rails哈希键/值在本地和heroku中创建的方式不同

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

我昨晚很晚才遇到这个问题,我刚刚知道发生了什么,但我想知道为什么。我在本地(使用sqlite)测试了我的代码,它运行得很好,但是当我部署到heroku(postgres)时,一个汇总表并没有显示正确的结果。摘要数据是从一个散列中检索的,该散列是通过查询活动记录创建的,先转换为行,然后转换为散列,最后生成一个键、值对散列,我们称之为@assignments。用于创建该结果的方法如下所示:

 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中的逻辑传递给映射类型,从而获得驱动程序选择的类型

见:


谢谢,这很有道理。对于如何不绕过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视图来解决这个问题,在不影响类型的情况下总结数据。谢谢,这很有意义。对于如何不绕过ActiveRecord逻辑映射类型,您有什么想法吗?AciveRecordResult.to_散列返回的内容与我所要查找的内容不同,因为它包含列名作为键。对此我没有直接的答案(我对Rails的了解相当薄弱)。我想到的是这样的:
@assignments=rst.rows.collect{k,v{k.to_I=>v.to_I}
其中
rst
是来自
Schedule.connection的结果。选择所有(@query)
。它增加了一个额外的步骤,但它应该可以跨sqlite和PostgreSQL工作。不过,我的建议是研究在开发中使用PostgreSQL,以避免其他类似的问题。我最终通过创建一个SQL视图来解决这一问题,在不影响类型转换的情况下汇总数据