Rails升级改写Squeel语法报Symbol与100无法比较错误如何解决
Ruby on Rails升级Squeel语法改写报错求助
背景说明
我正在将名为Emissions Gateway的程序升级到新版本Ruby on Rails。原有方法使用了Squeel gem的语法,改写时遇到了问题,折腾了4个多小时仍未解决。
相关代码与表结构
datalogger.rb 模型schema与相关方法
# == Schema Information # # Table name: dataloggers # # id :integer not null, primary key # project_id :integer # created_at :datetime not null # updated_at :datetime not null # original_file_name :string(255) # original_content_type :string(255) # original_file_size :integer # original_updated_at :datetime # status :string(255) default("incomplete") # hours :integer # readings_total :integer # readings_start :datetime # readings_stop :datetime # direct_upload_url :string(255) # version :string(255) # comments :string(255) # bypass :boolean default(FALSE) # device_id :integer # device_name :string(255) # device_description :string(255) # device_serial :integer # md5 :string(255) # user_id :integer # reported_at :datetime # user_reported_id :integer # reported :boolean def stats(temperatures) unless bypass @temperatures = temperatures @stats = {} @cumulative_percent_at = 0 @cumulative_readings = 0 @temperatures.each_cons(2) do |current_n, next_n| # puts "Evaluating #{current_n} and #{next_n}" @stats["#{next_n}"] = {} # CHANGED v0.009 9/27/2021 Scott Milella # readings_at = readings.where{(temperature.gt current_n) & (temperature.lteq next_n)}.sum(:frequency) readings_at = Reading.where(:temperature > current_n).and(:temperature <= next_n).sum(:frequency) @stats["#{next_n}"][:readings] = readings_at # puts "Readings at: #{readings_at}" # @cumulative_readings = @stats.map{|_, v| v[:readings] }.sum # puts "Cumulative Readings: #{cumulative_readings}" percent_at = ((readings_at.to_f / readings_total) * 100 ) @stats["#{next_n}"][:time_at] = percent_at @cumulative_percent_at += percent_at # puts "Percent at: #{percent_at}%" # puts "Cumulative Percent at: #{@cumulative_percent_at}" percent_over = 100 - @cumulative_percent_at @stats["#{next_n}"][:over] = percent_over # puts "Percent Over: #{percent_over}%" # puts "Progress: #{@cumulative_readings}/#{readings_total} readings" end end
修改的问题代码行
readings_at = Reading.where(:temperature > current_n) .and(:temperature <= next_n).sum(:frequency)
报错信息
修改后运行报comparison of Symbol with 100 failed错误,完全无法理解该报错,因为:temperature符号对应的是Reading模型的整数字段。
Reading模型表结构与定义
# == Schema Information # # Table name: readings # # id :integer not null, primary key # temperature :integer # frequency :integer # datalogger_id :integer # class Reading < ActiveRecord::Base belongs_to :datalogger attr_accessible :frequency, :temperature, :datalogger_id validates_presence_of :frequency, :temperature, :datalogger_id end
排查情况
不明白为什么两个整数无法比较,是否是语法写错了?运行没有报语法错误,但尝试了上千种写法,还出现过> not found in Array等各类错误。目前问题仅出现在这个方法中,若需要完整的datalogger.rb模型代码可后续提供。
以下是旧版正常运行的Emissions Gateway中截取的SQL日志,其中272是current_n的值、150是next_n的值,已在better_errors控制台验证过这两个值正确。暂不确定问题原因,猜测可能和不熟悉的each_cons方法有关。
格式化后的SQL日志
2021-09-27T18:50:49.173173+00:00 app[web.1]: (1.5ms) SELECT SUM("readings"."frequency") AS sum_id FROM "readings" WHERE "readings"."datalogger_id" = 272 AND (("readings"."temperature" > 100 AND "readings"."temperature" <= 150))
原始SQL日志
2021-09-27T18:50:49.173173+00:00 app[web.1]: (1.5ms) SELECT SUM("readings"."frequency") AS sum_id FROM "readings" WHERE "readings"."datalogger_id" = 272 AND (("readings"."temperature" > 100 AND "readings"."temperature" <= 150))
求助
希望大家能帮忙指出该方法的正确改写方式,折腾了好几个小时毫无进展,十分感谢。
我真的希望这个gem从来没有被开发过,它给我带来了太多麻烦!
谢谢,Scott
内容的提问来源于stack exchange,提问作者Scott Milella
相关产品推荐
相关产品推荐

