我有一个具有长字符串字段的ActiveRecord模型。实际上,这个字符串代表一个我想要就地修改而不是复制整个字符串的数组。
例如,假设Somemodel
有一个字符串字段array
。然后以下内容无法保存:
m = Somemodel.first
m.array[someindex] = somevalue
m.save
实际上,save
返回true似乎检查array
是否具有相同的object_id
并确定模型未更改并跳过往返数据库。
我最终使用了以下解决方法:
m = Somemodel.first
a = String.new(m.array) # remember, the array is represented as a string
a[someindex] = somevalue
m.array = a
m.save
请注意,修改其值后必须设置m.array
,因为save
会查看值,而不仅仅是object_id
。
这感觉很麻烦,需要复制整个字符串。不适合大型阵列。 我是否可以告诉save
在没有上述验证测试的情况下绕过这些is-model-modified检查?
答案 0 :(得分:13)
也许这就是您所寻找的:http://api.rubyonrails.org/classes/ActiveModel/Dirty.html:
如果就地修改了属性,那么请使用[attribute_name] _will_change!标记>属性正在改变。
答案 1 :(得分:0)
是的,在对象上实现哈希方法。