【问题标题】:Rails - Get old value in before_saveRails - 在 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 不起作用。

标签: ruby-on-rails 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_ 仅在更新时调用。检查这个stackoverflow.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' 之间没有区别
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多