我试图将模型逻辑保留在模型中,但是我无法让它对自身执行修改并使它们持久保存在数据库中。

在我的 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/

10-11 20:20
查看更多