在使用带有Rails4的Searchkick导入记录时,如何强制关联的快速加载?

时间:2018-08-24 17:34:40

标签: ruby-on-rails searchkick

对于使用默认(未指定)search_data的设置:

class Item < ActiveRecord::Base
 searchkick
 has_many :quantities, dependent: :destroy
 scope :search_import, -> { includes(:quantities) }

end

通过运行Item.reindex导入所有数据库记录时,每个“批次”都将按预期加载所有项目ID的数量。

但是,如果我想使用search_data方法以不同于默认属性的方式指定索引模型文档,则该方法将包括关联的模型数据,如下所示:

class Item < ActiveRecord::Base
 searchkick
 has_many :quantities, dependent: :destroy

 def search_data
   {
     part_number: standard_part_number,
     category_id: category_id.to_i,
     content_source_name: content_source_name,
     standard_price: standard_price.to_i,
     locations: quantities.map {|q| [q.location_code,
       quantity: q.value.to_i,
       bins: q.location_bins]
     }.to_h
   }
 end

 scope :search_import, -> { includes(:quantities) }

end

我在quantities上使用map来定义locations属性,然后使用Item.reindex返回导入,我发现它不仅渴望加载所有每个批次都与quantities关联,但随后又将每个quantities的所有item加载到数据库中,并为其建立索引的每个item记录再次命中数据库。

我是否在这里丢失了一些东西,以使Searchkick急于加载quantities模型,并能够使用已经加载的关联模型自定义搜索数据记录,而无需再次从数据库中再次提取数据item

更新 我已经确定ActiveRecord正常响应用于与与我们的应用程序中的加载的模型相关联的方法名称的方式存在某种干扰,尽管使用Searchkick可能与我们无关它确实揭示了问题。我不确定目前正在干扰什么,但这与关联上的target方法有关。可能是安装的gem导致了此问题。我确实设法找到了一种解决方法(暂时),使用item.association(:quantities).target代替了item.quantities,现在在运行重新索引时,它利用了已经急切加载的quantities和不会再为每个item

进入数据库

1 个答案:

答案 0 :(得分:0)

  

我看到它不仅渴望每批装载所有相关数量

这是预期的行为(并且很有可能是性能较高的行为),因为每个批次将加载不同的quantities,因为它们连接到不同的items,所以您无需保留所有内存中的数量。

  

每批,但同时也会为每个要索引的项目记录将命中的每个项目的所有数量再次加载到数据库中。

这实际上是意外的,但我的猜测是,在Quantity#location_code #value#location_bins)中的一种方法中,甚至其中一种方法在您调用的Item#standard_part_number#category_id#content_source_name#standard_price)上,有一些实现需要重新加载记录。 在不知道这些方法的代码的情况下,它纯粹是推测性的,但是代码的呈现部分看起来不错。