rails中脏数据的使用

在启用了脏数据(dirty objects)后,有时候一些不通过writer的修改是不会存到数据库里的。

比如以下代码:
self.org_common_flag[COMMON_FLAGS[:agent_flag]]= self.agent_flag ? "0" : "1"


实际上已经修改了字符串中某个字符了,但是因为不通过writer的调用,dirty的标记还是没变。查看:

引用

>> u.org_common_flag_changed?
=> false


一定要强制加一个will_change!,就会标志已修改。

self.org_common_flag_will_change!
self.org_common_flag[COMMON_FLAGS[:agent_flag]]= self.agent_flag ? "0" : "1"


查看一下:
引用

>> u.org_common_flag_changed?
=> true


脏数据减少了大量的无关数据 update,也带来了一些不方便,这就要求更好的测试覆盖。
调试的时候注意使用 _changed? , _change 的方法来检查是否触发脏数据。并且观察日志里的sql输出和检查数据库内容。

你可能感兴趣的:(sql,Ruby,Rails)