基本上,我有一个上市模型,每个列表都有一个国家/地区ID。我在搜索结果视图中需要国家/地区名称。我知道我可以执行@listing.country.name
,但这会对搜索结果中的每个商家信息执行额外查询。我正在使用Thinking Sphinx,在我的控制器中我有
@listings = Listing.search(@ts_params).page(page_num).per(limit)
我尝试添加.includes(:countries)
及其变体,但没有运气。
最好的方法是什么?我希望在与列表相同的查询中提取国家/地区数据。
我在列出图片时遇到了完全相同的问题 - 它正在为每个列表执行额外的查询以查找图像,当肯定可以在带有连接的图片中完成。
答案 0 :(得分:2)
您是否正在尝试加载相关模型(以避免N + 1查询问题),或者您是否尝试将关联模型加载到父模型的字段中?
如果是前者,您可能最好忘记:select
而不是:joins
使用:
ts_params[:sql][:include] = :countries, :listing_images
现在,您应该可以正常呼叫listing.countries
和listing.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