如何避免Rails缓存导致子对象看起来不存在



我正在处理一个订单应用程序,该应用程序接受来自CC处理供应商的订单,并将它们传递给履行应用程序。

class Order < ApplicationRecord
has_many :items, class_name: 'Product'
def payload
@builder = Nokogiri::XML::Builder.new do |xml|
...
self.items.each do |o|
...
end
end
@builder.to_xml
end
...
end

当收到订单时,它会创建所有需要的记录,然后尝试将有效负载传递给履行应用程序

def generate_order
ActiveRecord::Base.transaction do
# create order
...
External.send_order(self) # Web Call to Customer Support system <= this is were caching is happening
Product.create!(...) #create the actual product items
p "Payload #{self.payload}"
rescue StandardError => e
...
end
end

因为我们将订单本身传递给客户支持系统,所以在我们实际处理项目之前,Rails正在缓存没有任何项目的订单。因此,当我们试图查看有效负载时,这些项并不存在。

我可以将调用转移到客户支持系统,直到我们处理完项目并解决它,但是。。

我们如何确保使用当前/非缓存版本的订单?

从注释复制:我不知道External::send_order做什么,因为这段代码没有发布。

也就是说,如果你有一个缓存的关系,并且你想更新它,你可以使用ActiveRecord::Relation#reload来这样做。例如

self.items.reload.each do |o|
#...
end

此方法的作用是重置关系,然后再次加载记录。这意味着它将触发一个查询来重新收集关系的所有记录,所以要小心在哪里以及如何使用它(不建议在循环或迭代器中使用它(

最新更新