【问题标题】:how to force a Rails model to get a new version in a callback如何强制 Rails 模型在回调中获取新版本
【发布时间】:2015-01-05 21:12:28
【问题描述】:

我有两个班级,一个Item 和一个Price。我有一个 Item 对象的缓存哈希表示,我想在更新它或更新关联对象时清除/创建它。

在我的Item 课程中,我有:

在 item.rb 中:

  before_update do
    self.create_new_frags
  end

但是,Rails 认为它​​拥有最新版本,因此价格值不会更新。我尝试做 self.reload 但它仍然无法正常工作。我如何告诉这个实例它需要重新加载它的关联?这有点棘手,因为我不能让它重新加载所有内容,因为这是在 before_update 中,这样我会丢失即将更新的内容。

在 item.rb 中:

  def as_mig_hash type # part of create_new_frags
    self.reload  # didn't do anything
    r={}
    r[:id]=id
    r[:header]=header
    r[:detail]=detail
  end

【问题讨论】:

    标签: ruby-on-rails activerecord ruby-on-rails-3.2


    【解决方案1】:

    调用reload 仅影响属性。如果要重新加载关联,需要直接在关联上调用reload

    <association>.reload
    

    【讨论】:

    • 酷,我认为你是对的,仍在努力。在我的规范中,我将其作为 item.price.save 而不是 item.save - 当我切换到后者时,它起作用了(猜测有一个项目,因为它是 accepts_nested_attributes_for :price )。这很奇怪,因为由于可能存在安全漏洞,我有点想从我的模型中提取 Accepts_nested_attributes_for。这是一个 Rails 3.2.19 应用程序而不是 4*。仔细想想,我真的需要一种方法来只 touch 项目对象而不会导致无限循环
    • @timpone 你明白了吗?只是好奇。
    猜你喜欢
    • 1970-01-01
    • 2011-08-11
    • 1970-01-01
    • 2013-09-20
    • 2020-11-04
    • 1970-01-01
    • 1970-01-01
    • 2023-03-29
    • 1970-01-01
    相关资源
    最近更新 更多