在 console 下,我遇到个这样的问题,命令如下:
car = Car.first
new_number = car.number
new_number[0] = ?A
car.number = new_number
car.save
我只是想改变字符串number
里面的其中一个字母而已。
这样的保存是不成功的,car.save
不会进行 UPDATE 的,请问这是什么回事呢?应该怎么表达,他菜会 UPDATE 的?
#1 楼 @leeboqiang 改变了的,就算是car.number = new_number
这句也是显示值已经改变了,save 后在查看car
的值也是改变了的,但是关掉 console,在打开后,所有都回复之前那样了,貌似只是改了内存的值,没有改变数据库里的。
1.9.3p125 :002 > car.number[1] = 'A'
=> "A"
1.9.3p125 :003 > car.number
=> "LAS312"
1.9.3p125 :004 > car.save
(0.1ms) BEGIN
(0.1ms) COMMIT
=> true
结果是一样的,save 不执行 SQL 操作。
http://api.rubyonrails.org/classes/ActiveModel/Dirty.html 看看这个 貌似只能检测到直接赋值改变 找了半天源码也没看明白 谁看懂了说一下 刚好学习学习
number
是 car.number
的引用。直接用 ?A 这种方式去修改 number,没有被 AM track 到变化 (car.number = number
赋值时左值与右值是同一个对象,所以无效)。
可以这么用:
number = car.number.dup
number[0] = ?A
car.number = number
car.save
#14 楼 @leeboqiang #18 楼 @leeboqiang
Dirty
只是提供方法来跟踪更改,需要 ActiveRecord
自己去标记,参考 ActiveRecord 中的 Dirty
这个问题的确会弄倒不少新手,2 年前也遇过,楼主可以参考:http://hi.baidu.com/rainchen/item/6c4de860f3da682768105bee