2010-12-02 96 views
0

我有這種情況,我認爲這將是非常基本的,但發現我無法真正實現我所需要的。這就是爲什麼我對think_sphinx的專家有這個問題。使用thinking_sphinx搜索並過濾結果

這種情況是這樣的:我需要在公司列表中進行搜索,只返回那些有一個地址(可以有很多公司的地址)屬於某個城市或根本沒有的地址(我可以做)。

我有以下型號:

class Company < ActiveRecord::Base 
    has_many :company_addresses 

    define_index 
     indexes :name 
     indexes :description 
     indexes :keywords 
    end 
end 

class CompanyAddress < ActiveRecord::Base 
end 

的公司地址有city_id屬性。沒有循環遍歷從獅身人面像搜索返回的所有記錄,是否有辦法更容易地實現相同的事情?

我正在使用Rails 3.0.3和thinking_sphinx。

回答

4

你要添加指向爲公司city_id值的屬性:

has company_addresses.city_id, :as => :city_ids 

然後你就可以在屬於特定城市的公司進行過濾:

Company.search 'foo', :with => {:city_ids => @city.id} 

如果您要同時匹配到特定的城市沒有城市,這有點棘手,因爲屬性過濾器的OR邏輯充其量只是一點點棘手。理想情況下,您想要的是包含0或全部城市ID的單個屬性。這樣做取決於你的數據庫,因爲MySQL和Postgres的功能有所不同。

作爲一個粗略的想法,雖然 - 這可能會在MySQL工作:

has "IF(COUNT(city_id) = 0, '0', GROUP_CONCAT(city_id SEPARATOR ',')", 
    :as => :city_ids, :type => :multi 

的Postgres是相當類似的,雖然你可能需要使用CASE聲明,而不是IF,你一定會希望使用爲組級聯幾個功能:

array_to_string(array_accum(city_id, '0')), ',') 

(array_accum通過思考斯芬克斯提供,如有GROUP_CONCAT的PostgreSQL中沒有直接的等價物)。

無論如何,如果你需要這種做法,並獲得SQL都想通了,那麼你的查詢看起來是這樣的:

Company.search 'foo', :with => {:city_ids => [0, @city.id]} 

這將匹配0(表示無市),或在特定城市。

最後:如果你不引用company_addresses商會在正常的字段和屬性的任何地方,你需要強制你define_index加入:

join company_addresses 

希望提供足夠的線索 - 隨意繼續討論這裏或the Google Group

+0

正是我需要的!非常感謝你! – 2010-12-18 14:04:39