我试图将模型逻辑保留在模型中,但是我无法让它对自身执行修改并使它们持久保存在数据库中。
在我的 Controller 中:
@article.perform_some_calulcations!
在我的模型中:
def perform_some_calculations!
self.foo.gsub!(/regexp/, 'string')
self.save
end
如果我将
debugger
语句放入我的方法中,并且在 Controller 中对其进行调用后,则@article.foo
具有正确的值。但是,当我继续时,它不会持久存在于数据库中,并且webrick不会报告任何UPDATE
语句。怎么了我不知道我是否曾经做过,但是肯定有可能吗?
最佳答案
您的问题是,如果您“就地”修改属性,这意味着:在不给它分配新值的情况下,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
关于ruby-on-rails - Rails : How do I call `self.save` in my model and have it persist in the database?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/4039280/