我正在尝试将模型逻辑保留在我的模型中,但我无法让它对自身进行修改并将它们保留在数据库中。
在我的控制器中:
@article.perform_some_calulcations!
在我的模特中:
def perform_some_calculations!
self.foo.gsub!(/regexp/, 'string')
self.save
end
如果我将debugger
语句放入我的方法中,并且在控制器中调用它后,@article.foo
具有正确的值。但是,当我继续时,它不会在数据库中保留,webrick不会报告任何UPDATE
语句。
出了什么问题?我不知道我以前是否曾经这样做过,但肯定有可能吗?
答案 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')