gpt4 book ai didi

ruby-on-rails - 为什么 ActiveRecord#first 调用之间的 sleep 会改变其行为?

转载 作者:太空宇宙 更新时间:2023-11-03 16:48:58 24 4
gpt4 key购买 nike

我继承了一些用 Rails ~> 2.3.15 用 ruby​​ 1.8.7 编写的代码,它包含一个看起来像这样的测试:

class Wibble < ActiveRecord::Base
# Wibbles have integer primary keys and string names
end

def test
create_two_wibbles
w1 = Wibble.first
sleep 2 # This sleep is necessary to
w2 = Wibble.first

w1.name = "Name for w1"
w2.name = "Name for w2"

w1.save

w3 = Wibble.first

assert(!w3.update_attributes(w2.attributes))
end

sleep 行旁边的注释并没有被切断,它的字面意思是This sleep is necessary to。如果没有那个 sleep ,这个测试就会失败——移除它会以某种方式改变行为,而不是让它运行得快 2 秒。我一直在我们的版本控制系统中挖掘文件的历史记录,但消息没有提供任何信息。我也无法联系这个测试的原作者来弄清楚他们试图做什么。

根据我的理解,我们从数据库中提取同一条记录两次,以两种不同的方式编辑它,保存第一种,然后断言我们不能保存第二种。我怀疑这是一个确保我们的数据库正确锁定表的测试,但可以肯定的是,如果这失败了,我们的 Wibbles 会很好,而 ActiveRecord 会出错。办公室里没有人能弄清楚为什么这个测试可能是必要的,也不知道 sleep 声明可能有什么不同。有什么想法吗?

最佳答案

这可能是由于 Active Record 缓存和内存阻止了第二次查找实际进入数据库并获取新数据。

事实上,尝试打印每个 wibble 的 object_id;它们可能是完全相同的内存对象。如果是这样,那么测试有点有意义。

您也可以在 Controller 操作中进行相同的测试,并查看来自 Rails 的详细 SQL 日志;我希望第二个 find 调用告诉您它只是使用了缓存数据,实际上并没有运行任何 SQL 查询。

关于ruby-on-rails - 为什么 ActiveRecord#first 调用之间的 sleep 会改变其行为?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27399379/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com