【问题标题】:Rails association callback with cached query带有缓存查询的 Rails 关联回调
【发布时间】:2016-04-15 11:16:10
【问题描述】:

我有两个模型:

class Basket < ActiveRecord::Base
  has_many :products

  def recalculate_price!
    price = products.map(&:price).sum
    save
  end
end

class Product < ActiveRecord::Base
  belongs_to :basket

  after_save :update_basket

  def update_basket
    basket.recalculate_price!
  end
end

比我这样称呼它:

basket = Basket.new
basket.products.build(price)
basket.save

问题:basket.price 不要更新。

我调查了这个问题,发现update_basket 方法中有某种缓存。将reload 放在basket.recalculate_price! 之前可以解决此问题。

是否有任何选项可以保持update_basket 方法不变?我的申请中有很多这样的案例。

我想了解它的工作原理并避免将来出现类似问题。

注意:我最近将 rails 从 3.2 升级到了 4.2。在以前的版本中一切正常。

【问题讨论】:

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


    【解决方案1】:

    是否有任何选项可以让 update_basket 方法保持不变?

    当然。您可以在after_create 上设置一个条件以避免执行它有时:

    after_save :update_basket if: :basked_should_be_updated
    
    [...]
    
    private
    
    def basked_should_be_updated
      [...]
      # return true or false in here
    end
    

    【讨论】:

    • 您没有解决主要问题:为什么basket.price 不更新以及如何解决它
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多