ruby-on-rails - ruby 拼接!或者 <&lt;! (如何优雅地修改对象的状态)

标签 ruby-on-rails ruby operators

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

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 用于 :message。 'a' 只是一个用户实例。

最佳答案

这不是<<的问题不就地修改字符串 - 它确实就地修改字符串。 <<可能没有 !在它的名字中,但它仍然像一个爆炸方法。如果替换 <<,您可以很容易地看到这一点调用 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

关于ruby-on-rails - ruby 拼接!或者 <&lt;! (如何优雅地修改对象的状态),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13989619/

相关文章:

ruby-on-rails - 查找去年的月份名称

ruby-on-rails - 按名称记录调试日志中的每个方法调用

ruby - 如何在不编译或安装的情况下将 ruby​​ 部署到服务器中?

ruby-on-rails - ruby /Rails : suppress superclass functions - integration of Stripe and Devise

css - 限制按钮的可点击区域

javascript - Bootstrap Flash 警报 CSS 在移动屏幕上无法正常工作

ruby - Heroku - 如何开始工作人员(延迟工作)?

c - C 中的哪些运算符有错误的优先级?

javascript - "|"(管道)运算符的功能是什么?

haskell - 如何通过向给定元组添加元素来在 Haskell 中构建新元组