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

时间:2010-10-28 02:30:48

标签: ruby-on-rails activerecord persistence

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

在我的控制器中:

@article.perform_some_calulcations!

在我的模特中:

def perform_some_calculations!
  self.foo.gsub!(/regexp/, 'string')
  self.save
end

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

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

2 个答案:

答案 0 :(得分:18)

你的问题是,如果你“在适当的位置”修改了一个属性,这意味着:如果不给它赋一个新的值,那么Rails会认为没有什么新东西可以保存,所以它“优化”了豁免。 / p>

属性的每个写访问器都将设置一个标志,因此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

答案 1 :(得分:2)

您的属性可能受到保护。检查你的日志。如果是这样的话那么

self.save! 

self.save(false)

尝试从你的定义中删除感叹号。


self.foo = self.foo.gsub!(/regexp/, 'string')