Rails - 在 before_save 中获取旧值

Posted

技术标签:

【中文标题】Rails - 在 before_save 中获取旧值【英文标题】:Rails - Get old value in before_save 【发布时间】:2015-04-06 04:38:29 【问题描述】:

我试图通过在我的值中添加“_was”来获取 before_save 中的旧值,但它似乎不起作用。

这是我的代码:

before_save :get_old_title

def get_old_title
    puts "old value #self.title_was =>  #self.title"
  end

“title_was”和“title”都得到了刚刚保存的新标题。

是否可以在before_save 中获取旧值?

【问题讨论】:

您是否尝试在更新相同的行数据之前获取旧值? 使用 before_update 代替 before_save 也阅读ActiveModel::Dirty 并查看示例 你所做的是绝对正确的。你也可以粘贴你的控制器代码吗? 我同意@architgupta。这似乎是正确的。我不明白为什么before_save 不起作用。 【参考方案1】:

您获得相同值的原因很可能是因为您在创建记录时检查了输出。回调 before_savecreate()update() 上都被调用,但在 create() 上,titletitle_was 都分配了相同的初始值。所以答案是“是的,您可以在before_save 中获取旧值”,但您必须记住,只有当记录实际更改时,它才会与当前值不同。这意味着您获得的结果是正确的,因为相关更改不会在创建记录时发生。

【讨论】:

【参考方案2】:

使用before_update 代替before_save。它现在应该可以工作了。

【讨论】:

创建对象时调用before_save(仅一次),每次更新对象时调用before_update。 @SachinR 你错了。 before_save 在更新和创建时调用,而 before_update_ 仅在更新时调用。检查这个***.com/questions/18470749/… 对于是否有可能在 before_save (它是)中获取旧值并将 before_save 更改为 before_update 的问题的答案没有给出正确答案只是解决方法一个具体的案例。 对我不起作用,因为在更新记录时before_updatebefore_save 之前被调用,这对应于guides.rubyonrails.org/… 中的顺序。 talal7860 的答案对我来说效果很好,使用ActiveModel::Dirty[attr]_changed?[attr]_was 方法。【参考方案3】:

因此,上面的答案可能有效,但是如果我出于某种原因想要获取先前的值并使用它来执行某些任务,那么您将需要获取先前的值。就我而言,我使用了这个

after_update do
  if self.quantity_changed?
    sku.decrement(:remaining, (self.quantity_was - self.quantity) * sku.quantity)
  end
end

_was 和 _changed?添加到任何列都可以完成工作。

【讨论】:

在编写测试时。我发现我必须使用 before_update 否则,'quantity' 和 'quantity_was' 之间没有区别

以上是关于Rails - 在 before_save 中获取旧值的主要内容,如果未能解决你的问题,请参考以下文章

Rails:before_save 变量内容

Rails :before_save 大写私有方法

带有 MD5 摘要的 Rails 模型 before_save

Rails:before_save - 堆栈级别太深

Ruby on Rails:before_save 字段为小写

Rails Rspec / Factory Bot没有调用模型before_save回调