Rails:如何在我的模型中调用`self.save`并将其保留在数据库中?

nfm*_*nfm 12 activerecord persistence ruby-on-rails

我正在尝试将模型逻辑保留在我的模型中,但是我无法让它对自身执行修改并让它们在数据库中保留.

在我的控制器中:

@article.perform_some_calulcations!
Run Code Online (Sandbox Code Playgroud)

在我的模型中:

def perform_some_calculations!
  self.foo.gsub!(/regexp/, 'string')
  self.save
end
Run Code Online (Sandbox Code Playgroud)

如果我将debugger语句删除到我的方法中并在控制器中调用它之后,则@article.foo具有正确的值.但是,当我继续时,它不会在数据库中保留,webrick不会报告任何UPDATE语句.

出了什么问题?我不知道我以前是否曾经这样做过,但肯定有可能吗?

Ars*_*en7 18

你的问题是如果你"修改"一个属性,这意味着:如果不给它赋一个新的值,那么Rails会认为没有什么新东西可以保存,所以它"优化"了豁免.

属性的每个写访问器都将设置一个标志,因此save方法将知道它应该检查当前值是否确实与从数据库中读取的值不同.这就是为什么self.foo = self.foo.gsub(/regexp/, 'string')有效(注意这里不需要感叹号).

如果您需要"就地"修改属性,例如使用gsub!replace,请使用:

def perform_some_calculations!
  foo_will_change!
  self.foo.gsub!(/regexp/, 'string')
  self.save
end
Run Code Online (Sandbox Code Playgroud)