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

Ruby on rails 如何避免Rails缓存导致子对象看起来不存在,ruby-on-rails,caching,Ruby On Rails,Caching,我正在处理一个订单应用程序,它接受来自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

我正在处理一个订单应用程序,它接受来自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
def生成订单
ActiveRecord::Base.transaction do
#创建订单
...
外部。向客户支持系统e发送订单(自我)#网络电话
...
结束
结束
因为我们正在将订单本身传递给客户支持系统,所以在我们实际处理项目之前,Rails正在缓存没有任何项目的订单。因此,当我们试图查看有效负载时,项目不存在

我可以将标注移动到客户支持系统,直到我们处理项目并解决它之后,但是


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

从注释中复制:我不知道
External::send\u order
的作用,因为此代码未发布

也就是说,如果您有一个缓存的关系,并且您希望更新它,那么您可以使用它来进行更新。e、 g

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

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

我认为这与缓存无关。这一行
p“Payload#{self.Payload}”
实际上在事务块内吗?问题可能是事务尚未提交,这意味着您试图检索的记录实际上并不存在。您能发布调用此方法的日志吗?@engineersmnky感谢您的回复。它位于事务块内,但正在移动外部。在产品之后将订单(自身)发送到。创建!()允许“Payload#{self.Payload}”查看已创建的项目。我不知道
External::send_order
的作用,因为此代码未发布,但您可以在
Payload
中创建关联,例如
self.items.reload
@enginersmnky谢谢!重新加载方法是我正在寻找的。如果你能把它作为一个答案,我会把它标记为接受。