gpt4 book ai didi

ruby-on-rails - `Time.now.utc` Rails 和 `now() at time zone ' utc'` postgres 之间的区别

转载 作者:行者123 更新时间:2023-11-29 12:13:08 24 4
gpt4 key购买 nike

问题如下:我有一个模型 - MyModel1 和 MyModel2,它们具有关系 - MyModel1 有_很多 MyModel2。现在,数据库是 postgres,MyModel2 上有一个数据库触发器,它在插入/更新/删除时更新 MyModel1 的 updated_at 字段:

UPDATE my_model1 SET updated_at = (now() at time zone 'utc')

现在,我有一个规范,可以验证它是否真的完成了我想要的:

it "updates the updated_at field" do
mymodel1instance.update_attributes(updated_at: Time.now - 1.day)
mymodel2build.save! # mymodel2build belongs_to mymodel1instance
mymodel1instance.updated_at.to_s.should == Time.now.utc.to_s
end

我相信可能会有所延迟。奇怪的是 mymodel2build.updated_at 字段比 Time.now.utc 提前 1 秒。

规范结果:

   expected: "2013-12-17 13:30:33 UTC"
got: "2013-12-17 13:30:32 UTC" (using ==)

备注:规范并不总是失败,它只是偶尔失败。谁能解释为什么会这样?

最佳答案

在 Postgres 中,你有 now()clock_timestamp():

  • now() 将返回当前事务开始的时间戳。 (或者语句的语句,如果它是事务外的只读查询。)
  • clock_timestamp() 将像 Ruby 的 Time.now 一样,返回时钟的时间戳。

顺便说一句,您的测试相当于测试 a) Ruby 返回系统时钟的当前时间和 b) Postgres 对单个字段的更新实际发生。这使得它与编写测试来验证 2 + 2 = 4 一样有用。当然,并不是说这些测试不可能失败;就是这样,恕我直言,您可能有更重要的事情要花时间,即测试抽象级别更高的事情,例如公共(public) API 端点。 (后者比用单元测试卡住你自己的内部结构重要几个数量级。)

关于ruby-on-rails - `Time.now.utc` Rails 和 `now() at time zone ' utc'` postgres 之间的区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20635728/

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