Rails - 在before_save中获取旧值

use*_*696 11 ruby-on-rails before-save

我试图before_save通过在我的值中添加"_was" 来获得旧值,但它似乎不起作用.

这是我的代码:

before_save :get_old_title

def get_old_title
    puts "old value #{self.title_was} =>  #{self.title}"
  end
Run Code Online (Sandbox Code Playgroud)

"title_was"和"title"都获得了新标题.

是否有可能获得旧的价值before_save

san*_*arp 8

而不是before_save使用before_update.它现在应该工作.

  • @SachinR你错了。在更新以及创建时调用before_save,仅在更新时调用before_update_。检查此http://stackoverflow.com/questions/18470749/what-is-the-difference-between-the-before-save-and-before-update-active-record (3认同)
  • 对于是否有可能在`before_save`(它是IS)中获取旧值并将`before_save`更改为`before_update`只是特定情况的解决方法,答案没有给出正确的答案. (3认同)

小智 6

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

after_update do
  if self.quantity_changed?
    sku.decrement(:remaining, (self.quantity_was - self.quantity) * sku.quantity)
  end
end
Run Code Online (Sandbox Code Playgroud)

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


sil*_*rdr 6

获得相同值的原因很可能是因为在创建记录时检查了输出。回调before_save是呼吁两国create()update()create()两者titletitle_was分配相同,初始值。因此答案是“是的,您可以在内部获取旧值before_save”,但是您必须记住,只有在实际更改记录的情况下,它才会与当前值不同。这意味着您得到的结果是正确的,因为在创建记录时不会发生有问题的更改。