gpt4 book ai didi

mysql - ActiveRecord 缓存和 update_attributes

转载 作者:行者123 更新时间:2023-11-29 04:59:54 24 4
gpt4 key购买 nike

如果一个模型在本地更改了一个属性,然后又将其改回,ActiveRecord 不会将更改发送到数据库。这对性能非常有用,但如果其他东西更改了数据库,并且我想将其恢复为原始值,则更改不会生效:

model = Model.find(1)
model.update_attribute(:a, 1) # start it off at 1

# some code here that changes model.a to 2
model.a = 2 # I know it changed, reflecting my local model of the change

model.update_attribute(:a, 1) # try change it back, DOESN'T WORK

最后一行不起作用,因为 AR 认为在数据库中它仍然是 1,即使其他东西将它更改为 2。如果我知道新值,我如何强制 AR 更新或直接更新缓存?

旁注:更改它的代码是锁定记录的 update_all 查询,但它有副作用,会弄乱缓存。多台机器读取此表。如果有更好的方法来做到这一点,我很想知道。

Model.update_all(["locked_by = ?", lock_name], ["id = ? AND locked_by IS NULL", id])

最佳答案

为此使用reload 方法。

model.reload(:select => "a")

你可以试试will_change!方法(不清楚你的改变是如何发生的,但你可以试试这个方法)。

model.update_attribute(:a, 1) # start it off at 1
model.a_will_change! #fore warn the model about the change
model.a = 2 #perform the change
model.update_attribute(:a, 1)

关于mysql - ActiveRecord 缓存和 update_attributes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2404195/

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