gpt4 book ai didi

ruby - 为什么 datamapper 不更新记录/检测脏度?

转载 作者:数据小太阳 更新时间:2023-10-29 08:24:00 25 4
gpt4 key购买 nike

最近想写一个简单的迁移脚本。我写道:

@entries = Entries.all(:text => /test/)

@entries.each do |entry|
entry.update(:text => entry.text.gsub!(/test/, "no-test"))
end

它没有保存记录,即使更新语句返回 true。我错过了什么?

最佳答案

在 1.x 系列的 datamapper 中,脏跟踪是通过调用 #== 对新旧属性值进行脏检测来完成的。如果一个对象就地发生突变(例如使用 String bang 方法),则无法检测到更改,因为“原始”状态也会发生突变。

基本上内部会发生以下情况:

a = "foo"
b = a.gsub!("foo", "bar")
a == b # => true both a and b refer to the same mutated object
a.equal?(b) # => true

在您的示例中,您将原始的变异属性分配回对象,没有身份更改 => 没有检测到更新。

如果您通过 String#gsub 创建一个新对象,而不是通过 String#gsub! 改变原始属性值,您最终会得到一个可检测到的变化。

通过分配具有不同值的新对象,会发生以下情况:

a = "foo"
b = a.gsub("foo", "bar")
a == b # => false, loaded state does not equal resource state so change is detected
a.equal?(b) # => false

为了覆盖所有情况,分配一个具有相同值的新对象:

a = "foo"
b = "foo"
a == b # => true, no dirtyness detected.
a.equal?(b) # => false

希望这足以解释语义差异以解释所有类似情况。

顺便说一句,在 datamapper 2.0 中,我们有一个 differend 机制,它也可以捕获适当的突变。免责声明,我是这个名为 dm-session 的组件的作者.

关于ruby - 为什么 datamapper 不更新记录/检测脏度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13917062/

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