在rails中的相同查询中从关联模型加载数据

时间:2013-09-22 16:22:36

标签: ruby-on-rails-4 thinking-sphinx eager-loading

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

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

我尝试添加.includes(:countries)及其变体,但没有运气。

最好的方法是什么?我希望在与列表相同的查询中提取国家/地区数据。

我在列出图片时遇到了完全相同的问题 - 它正在为每个列表执行额外的查询以查找图像,当肯定可以在带有连接的图片中完成。

4 个答案:

答案 0 :(得分:2)

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

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

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

现在,您应该可以正常呼叫listing.countrieslisting.listing_images来访问子模型。

答案 1 :(得分:1)

思考Sphinx为渴望加载关联实体提供功能,因此对于急切加载,我们不需要添加[:sql]。以下是这样做的方法。
对于使用sphinx的热切加载关联实体。

ts_params[:include] = [:country, :listing_image]

答案 2 :(得分:0)

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

@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"

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

答案 3 :(得分:0)

当前的v4语法是:

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

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