Ruby on rails 活动记录查询的结果不一致

Ruby on rails 活动记录查询的结果不一致,ruby-on-rails,ruby,sqlite,activerecord,Ruby On Rails,Ruby,Sqlite,Activerecord,这是我的Person模型,在方法中有以下查询: def get_uniq_person_ids uniq_person_ids = select('person_id').where(:state => '1').uniq uniq_person_ids end 我的测试如下: def test_uniqueness Person.delete_all assert_equal(0, Person.count) # ..... Adding 8

这是我的
Person
模型,在方法中有以下查询:

def get_uniq_person_ids
    uniq_person_ids = select('person_id').where(:state => '1').uniq
    uniq_person_ids
end
我的测试如下:

def test_uniqueness
    Person.delete_all
    assert_equal(0, Person.count)

    # ..... Adding 8 rows to the database with 2 unique person_id.....

    pids = Person.get_uniq_person_ids
    assert_equal(pids.size, 2)    
end
测试失败,原因如下:

失败: 预料之中,但事实并非如此

表中有8行,但只有2个唯一的person_id

这就是我所尝试的:

  • 将PID置于断言之前。它只打印2个对象。测试失败,出现上述消息
  • binding.pry
    就在查询之前。尺寸为2,这是预期的,这次测试通过
为什么结果如此不一致?这是时间问题吗


注意:我正在使用sqlite作为我的数据库。

好的,所以我不确定实际问题是什么,但下面解决了它:

def get_uniq_person_ids
    uniq_person_ids = select('person_id').where(:state => '1').uniq
    uniq_person_ids = uniq_person_ids.map(&:person_id)
    uniq_person_ids
end

我添加了行
uniq\u person\u id=uniq\u person\u id.map(&:person\u id)
来创建person\u id数组。

我不确定为什么需要测试从数据库中擦除“所有数据”的任何内容;如果你需要擦,就擦吧。不过,这就引出了一个问题:为什么要手动操作呢。如果不知道更多关于DB在测试环境中是如何被植入种子的,那么很难说。如果您在测试环境中,几乎可以肯定这不是“计时”。@DaveNewton我正在擦除测试环境数据库中的所有数据,以便插入的数据是唯一可用的数据,并且计数是可预测的。这只是db的预测试设置;我想问的是,为什么要手动擦除数据——有一些已知的Rails机制可以擦除数据库。仅供参考,预期值在参数列表中排在第一位。同样,没有更多的信息很难说。如果您的测试是“正常”的,那么它们也是以随机顺序运行的,这意味着可能有以前测试的剩余数据,因为您在运行之间没有以编程方式清理数据库。@DaveNewton编辑了我的测试,我没有手动删除任何内容。我只是没有显示清除数据库的代码部分,我认为这是不必要的。你没有手动删除任何内容,但有清除数据库的代码吗?那是。。。令人困惑(现在您已经显示了手动删除内容的位置。)无论如何。如何添加行?可能与如何确定对象中的相等性有关,或者与对象实际包含的内容有关。在插入和查询之前或之后不显示数据,这使得人们很难提供帮助。