Ruby - 活动记录查询 - 比较产生误报的变量

Ruby - Active Record Query - Comparing Variables Producing False Positive

警告这是一个新手问题,因为它是我第一次使用 active recored 和 oracle db.Trying 来了解 active record 返回值及其比较运算符。

总而言之,我想获得一个报价 ID,然后与存储在数据库中的报价值进行比较,并进行比较以找出报价是否相同(听起来很简单:))

步骤:

  1. 我有一个 html ref 元素值,我从 url 中剥离并存储在 offer_id 中,即 site/offers/XXX0317

  2. 创建 get_offer 和 verify_offer 数据库方法

    def self.get_offer(offer_id)
      @offer_id = offer_id
      @offer = find_by_sql "select bonus_offer_id
      from my_offers
      where BONUS_OFFER_ID = '#{offer_id}'
      And ROWNUM <= 1"
      @return_value = @offer.first[0] 
    end
    
    def self.verify_offer_id
      if @return_str == @offer_id
        puts "Offer loaded and ids match in DB"
      else
        " No match in db - offer not loaded"
      end
    end
    
  3. 使用 puts 打印结果:

    XXX0317 XXX0317 数据库中不匹配 - 商品未加载

场景通过

我读到返回的数据数组 returns 所有列和值因此使用 first[0]。我假设返回的 db 值和我的报价 ID 不能直接比较因此 false positve.I 已经尝试使用 .attributes 但不确定如何解决这个问题。

-使用 Watir Webdriver 作为 DSL,如果有任何意义的话

任何帮助都会很棒。

非常重要的是,您要准确了解您在测试中比较的等效项。该测试可能无法捕获您认为应该捕获的内容,因为虽然这两个值在逻辑上对您来说是相同的 (01BXXX0317),但我敢打赌它们完全不同 类.

如果您按以下方式重写该测试:

def self.verify_offer_id
  puts "Same class       : #{@return_str.class == @offer_id.class}"
  puts "Equivalent object: #{@return_str == @offer_id}"
  puts "Same String value: #{@return_str.to_s.eql?(@offer_id.to_s)}"
end

...我猜输出是:

  Same class       : false
  Equivalent object: false
  Same String value: true

当您将对象传递给 puts 方法时,它们将被强制转换为 String 值,因此在打印时它们看起来是一样的。但实际上,您已经剥离了有关该对象的所有其他内容。

检查上述输出的另一种方法是:

puts "@return_str: #{@return_str.inspect}"
puts "@offer_id  : #{@offer_id.inspect}"

这将非常清楚地向您展示两者之间的对象差异。