对于使用默认(未指定)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
答案 0 :(得分:0)
我看到它不仅渴望每批装载所有相关数量
这是预期的行为(并且很有可能是性能较高的行为),因为每个批次将加载不同的quantities
,因为它们连接到不同的items
,所以您无需保留所有内存中的数量。
每批,但同时也会为每个要索引的项目记录将命中的每个项目的所有数量再次加载到数据库中。
这实际上是意外的,但我的猜测是,在Quantity
(#location_code
#value
或#location_bins
)中的一种方法中,甚至其中一种方法在您调用的Item
(#standard_part_number
,#category_id
,#content_source_name
,#standard_price
)上,有一些实现需要重新加载记录。
在不知道这些方法的代码的情况下,它纯粹是推测性的,但是代码的呈现部分看起来不错。