Ruby concat! o <<! (como modificar el estado del objeto elegantemente)

¿Hay una manera más elegante de hacer esto?

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

Por ejemplo, lo siguiente no funciona:

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

Respectivamente no modificando, o devolviendo un error (ya que no hay

 <<! 

operador)

key: widget es una instancia de Widget. Los widgets pueden tener notas. Las notas tienen un attr_accessible para: mensaje. ‘a’ es solo una instancia de usuario.

Esto no es un problema de << no modificar la cadena en el lugar, ya que modifica la cadena en el lugar. << podría no tener un ! en su nombre, pero todavía actúa como un método bang. Puede ver esto fácilmente si reemplaza << con una llamada a gsub! (que tiene un ! en su nombre) en su código de ejemplo: no hará ninguna diferencia.

En su caso, recupera la cadena sin cambios porque widget.notes.where (: author_id => a) .first probablemente devuelve un nuevo objeto cada vez, que tendrá su propia cadena independiente.

Además, si el message corresponde a una columna de la base de datos, no a una variable de instancia, no estoy seguro de si la invocación de métodos de mutación funcionará ya que evitaría la invocación de los métodos de establecimiento de ActiveRecord (o el ORM que esté usando). Usar += podría ser tu apuesta más segura aquí.

Esto debería funcionar como quieras:

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