Ruby concat! 还是<<! (如何优雅地修改对象的状态)

有更优雅的方式来做到这一点:

widget.notes.where(:author_id => a).first.message= widget.notes.where(:author_id => a).first.message << "Potato" 

例如,以下内容不起作用:

 widget.notes.where(:author_id => a).first.message < a).first.message <<! "Potato" 

分别不修改或返回错误(因为没有

 <<! 

运营商)

key:widget是Widget的一个实例。 小部件可以有笔记。 Notes有一个attr_accessible:message。 ‘a’只是一个用户实例。

这不是<<不能就地修改字符串 - 它确实就地修改字符串”的问题。 <<可能没有! 在它的名字,但它仍然像一个爆炸方法。 如果你用gsub!调用替换<< ,你可以很容易地看到这个gsub! (在其名称中有一个! )在您的示例代码中:它不会产生一些区别。

在你的情况下,你得到了未更改的字符串,因为widget.notes.where(:author_id => a).first可能每次都返回一个新对象,它将拥有自己的独立字符串。

此外,如果message对应于数据库列,而不是实例变量,我不确定调用其上的mutating方法是否会起作用,因为它会绕过调用ActiveRecord(或者你正在使用的任何ORM)setter方法。 使用+=可能是您最安全的选择。

这可以按你的意愿工作:

 note = widget.notes.where(:author_id => a).first note.message += "Potato" note.save