【问题标题】:Inconsistent results from active-record query活动记录查询的结果不一致
【发布时间】:2015-12-28 23:34:38
【问题描述】:

这是我的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。

这是我尝试过的:

  • puts pids 断言之前。它只打印 2 个对象。测试失败并显示上述消息。
  • binding.pry 就在查询之前。大小为 2,这是预期的,这次测试通过了。

为什么结果如此不一致?是时间问题吗?

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

【问题讨论】:

  • 我不确定您为什么需要测试有关从数据库中擦除“所有数据”的任何内容;如果你需要擦它,擦它。不过,这引出了一个问题,为什么您要手动进行操作。如果不了解您的数据库是如何在测试环境中播种的,就很难说。如果您在测试环境中,这几乎肯定不是“时间”。
  • @DaveNewton 我正在擦除我的测试环境数据库中的所有数据,以便我插入的数据是唯一可用的数据并且计数是可预测的。这只是数据库的预测试设置。
  • 对,明白了;我在问你为什么要手动擦除数据——Rails 有已知的擦除数据库的机制。仅供参考,期望值首先出现在 arg 列表中。同样,如果没有更多信息,很难说。如果您的测试是“正常的”,它们也会以随机顺序运行,这意味着之前的测试可能会遗留数据,因为您没有在运行之间以编程方式清理数据库。
  • @DaveNewton 编辑了我的测试,我没有手动删除任何东西。我只是没有显示我认为没有必要清除数据库的那部分代码。
  • 您不是手动删除任何内容,而是有清除数据库的代码?这……令人困惑。 (您现在已经显示了手动删除内容的位置。)无论如何。你是如何添加行的?

标签: ruby-on-rails ruby sqlite activerecord


【解决方案1】:

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

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_person_ids = uniq_person_ids.map(&:person_id) 来创建 person_ids 数组。

【讨论】:

  • 可能与如何确定对象中的相等性或对象实际包含的内容有关。您在插入和查询之前或之后不显示数据,使人们难以提供帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-09-21
  • 2012-08-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-06
  • 2023-03-28
  • 1970-01-01
相关资源
最近更新 更多