新手问题 Rails console 下的一个赋值问题

QueXuQ · 2013年02月06日 · 最后由 JeskTop 回复于 2013年06月24日 · 3050 次阅读

在 console 下,我遇到个这样的问题,命令如下:

car = Car.first
new_number = car.number
new_number[0] = ?A
car.number = new_number
car.save

我只是想改变字符串number里面的其中一个字母而已。 这样的保存是不成功的,car.save不会进行 UPDATE 的,请问这是什么回事呢?应该怎么表达,他菜会 UPDATE 的?

你看了 new_number 的值改变了吗啊?

#1 楼 @leeboqiang 改变了的,就算是car.number = new_number这句也是显示值已经改变了,save 后在查看car的值也是改变了的,但是关掉 console,在打开后,所有都回复之前那样了,貌似只是改了内存的值,没有改变数据库里的。

恩 就是这样的 console --sandbox 下就是这样 为了你调试的 不会改数据库的数据 你不会打开了 sandbox 吧

#3 楼 @leeboqiang 没有打开沙箱。如果直接,让如下:

car.number = "Axxxx"
car.save

又可以成功的。

那就是 new_number 是引用变量 我现在没环境也没法给你测试 我记得是可以用变了的 应该没问题才对

car.number[0] = ?A 试试

#6 楼 @leeboqiang 这个也是试过,一样是不可以的。我也奇怪是变量的什么问题,还是因为 ?X这样的赋值不可以吗? 搞不懂。

?x 的我还第一次见呢 呵呵 我也是新手 对 ruby 看的比较少 刚还在查?的用法呢我以为 =? 是一起的

car.number[0]='c' 这样呢?

#8 楼 @leeboqiang ?号是和后面那个字母一起,字符串改变某个位置的一个值,很少用。但是一用就好奇为什么会发生这样的问题。

#9 楼 @leeboqiang

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 看看这个 貌似只能检测到直接赋值改变 找了半天源码也没看明白 谁看懂了说一下 刚好学习学习

numbercar.number 的引用。直接用 ?A 这种方式去修改 number,没有被 AM track 到变化 (car.number = number 赋值时左值与右值是同一个对象,所以无效)。

可以这么用:

number = car.number.dup
number[0] = ?A
car.number = number
car.save

建议你改成car.save!试试

#15 楼 @ashchan Very Good.竟然有这样的小细节。谢谢 #14 楼 @leeboqiang 正确方法:number = car.number.dup #16 楼 @iBachue save!还是不可以的。

#17 楼 @QueXuQ 我当时也在考虑值类型和 引用类型的问题 呵呵 学习了 但是他是怎么判断是否改变的 我还是不清楚 不知道哪位大神看过源代码讲解一下

#14 楼 @leeboqiang #18 楼 @leeboqiang

Dirty 只是提供方法来跟踪更改,需要 ActiveRecord 自己去标记,参考 ActiveRecord 中的 Dirty

这样不行吗?

car.number[0] = ?A
car.save

这个问题的确会弄倒不少新手,2 年前也遇过,楼主可以参考:http://hi.baidu.com/rainchen/item/6c4de860f3da682768105bee

#21 楼 @rainchen 确实,幸好在 console 里发现,如果在代码里写着就埋下陷阱了。 #20 楼 @fenprace 你的这个方法是不可以的,你可以在 console 下试一试。

car.changed_attributes[:number] = true 就可以保存了

这个问题还是挺诡异。

需要 登录 后方可回复, 如果你还没有账号请 注册新账号