红宝石康卡特!还是<<!(如何优雅地修改对象的状态)



有没有更优雅的方法:

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 << "Potato"
widget.notes.where(:author_id => a).first.message <<! "Potato"

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

)
<<!

操作符)

key: widget是widget的一个实例。小部件可以有注释。Notes有一个attr_accessible for:message。'a'只是一个用户实例。

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

在您的示例中,您将返回未更改的字符串,因为widget.notes。Where (:author_id => a).first每次大概返回一个新对象,它将有自己独立的字符串。

进一步,如果message对应于一个数据库列,而不是一个实例变量,我不确定是否调用变异的方法对它甚至会工作,因为它会规避调用ActiveRecord的(或任何ORM你正在使用)setter方法。在这里,使用+=可能是最安全的选择。

这应该是你想要的:

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

相关内容