4

基本上,我有一个列表模型,其中每个列表都有一个国家/地区 ID。我的搜索结果视图中需要国家名称。我知道我可以做到@listing.country.name,但这会对我的搜索结果中的每个列表执行额外的查询。我正在使用 Thinking Sphinx,在我的控制器中我有

@listings = Listing.search(@ts_params).page(page_num).per(limit) 

我试过添加.includes(:countries)和变化,但没有运气。

解决这个问题的最佳方法是什么?我希望在与列表相同的查询中获取国家数据。

我在列出图像时遇到了完全相同的问题 - 它正在为每个列表执行额外的查询以找到图像,当然它可以通过连接一起完成。

4

4 回答 4

2

您是在尝试加载关联模型(以避免 N + 1 查询问题),还是尝试将关联模型加载到父模型的字段中?

如果是前者,你最好忘记:select而不是:joins使用:

ts_params[:sql][:include] = :countries, :listing_images

现在您应该可以正常调用listing.countrieslisting.listing_images访问子模型了。

于 2013-09-25T14:22:31.130 回答
1

Thinking Sphinx 提供了预加载关联实体的功能,因此对于预加载我们不需要添加[:sql]. 以下是执行此操作的方法。
用于使用 sphinx 急切加载关联实体。

ts_params[:include] = [:country, :listing_image]
于 2016-08-03T12:43:50.460 回答
0

我设法使用 Thinking Sphinx 提供的 :sql 哈希解决了这个问题。我现在有以下内容:

@ts_params[:sql][:joins] = "INNER JOIN countries ON countries.id = listings.country_id INNER JOIN listing_images ON listing_images.listing_id = listings.id"
@ts_params[:sql][:select] = "listings.*, countries.name as country_name, listing_images.image as image_name"

这是正确检索国家名称和图像名称,但我仍然需要做一些工作才能使其与图像一起使用 - 我认为这值得提出自己的问题!

于 2013-09-22T20:10:39.363 回答
0

当前的 v4 语法是:

Article.search :sql => {:include => :user}

参考:https ://freelancing-gods.com/thinking-sphinx/v4/searching.html

于 2018-05-14T16:31:10.003 回答