2013-09-22 23 views
3

基本上,我有一個列表模型,其中每個列表都有一個國家ID。我在搜索結果視圖中需要國家/地區名稱。我知道我可以做@listing.country.name,但是這會爲我的搜索結果中的每個列表執行額外的查詢。我使用的思考獅身人面像,並在我的控制器我有在相同的查詢中加載關聯模型中的數據in rails

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

我曾嘗試加入.includes(:countries)及其變化,但沒有運氣。

這是什麼最好的方法呢?我希望國家數據在與列表相同的查詢中獲取。

我對列表圖像有完全相同的問題 - 它正在爲每個列表執行額外的查詢以查找圖像,當然,它可以在一個連接中完成。

回答

2

您是否試圖加載相關模型(以避免N + 1查詢問題),還是試圖將相關模型加載到父模型的字段?

如果是前者,你可能會更好過約:select,取而代之的:joins使用遺忘:

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

現在,你應該能夠調用listing.countrieslisting.listing_images訪問兒童模特,爲正常。

+0

謝謝taavo,目前我有選擇/連接工作,因爲我想少查詢更好? include選項也可以工作,但它會加載大量不必要的數據,因爲每個列表只需要一個「listing_image」結果。也許我可以爲列表創建一個新的關聯 - has_one:main_image,它只是拉一個圖像? – Dave

+0

是的,如果你只需要一個,並且你希望能夠使用activerecord的'includes'(這裏通過':include'觸發)加載它,那麼你將需要一個'has_one'。 – Taavo

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" 

這是正確檢索國家名稱和形象的名字,但我仍然有一些工作在使其與圖像的工作要做 - 我認爲這將值得它自己的問題!

0

思維獅身人面像提供的功能,以加載相關的實體,所以對於急切的加載,我們不需要添加[:sql]。以下是做到這一點的方法。
用於使用sphinx急切加載關聯的實體。

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

這種方法適用於TS v1/v2,TS v3需要':sql'嵌套。 – pat