2014-04-14 44 views
0

我有一個國家的表格(下面列出的模型)。我將思維獅身人面像添加爲搜索,並希望用它來顯示結果。試圖訪問獅身人面像內部數據

country.rb

class Country < ActiveRecord::Base 
    has_many :provinces 
    has_many :cities 
    has_many :zones 
    has_many :users 
    attr_accessible :alpha_2, :alpha_3, :country_name, :numeric, :country_active 

    scope :ordered, order("country_name") 
    scope :active, where(:country_active => true) 

end 

country_index.rb

ThinkingSphinx::Index.define :country, :with => :active_record do 
    indexes country_name, :sortable => true 

    has created_at, updated_at 
    has "(select COUNT(provinces.id) from provinces where provinces.country_id = id)", :as => :province_count, :type => :integer 
end 

在我看來,我需要一個有條件的鏈接添加到屬於某一個國家的省份,如果全省計數該國大於0.

count = country.provinces.count 
if count > 0 
    link_to(country.country_name, provinces_path(:id => country.id)) 
else 
    country.country_name 
end 

我試圖用count替換活動記錄查詢w ith

count = Country.search(:select => "province_count", :with => {:country_name => country.country_name}) 

但是我還沒有成功地完成這項工作。這怎麼能實現。我工作過的this link

回答

1

有兩點需要注意,應該幫助解決這個問題:

首先,你可以強制通過在索引定義使用join方法對協會的加入 - 這樣可以節省需要一個完整的子查詢:

ThinkingSphinx::Index.define :country, :with => :active_record do 
    indexes country_name, :sortable => true 

    has created_at, updated_at 
    has "COUNT(provinces.id)", :as => :province_count, :type => :integer 

    join provinces 
end 

其次,更重要的是,如果你想訪問使用搜索結果時獅身人面像的屬性,你需要使用的思考獅身人面像窗格用於這一目的:

search = Country.search(:with => {:sphinx_internal_id => country.id}) 
search.context[:panes] << ThinkingSphinx::Panes::AttributesPane 
count = search.first.sphinx_attributes['province_count'] 

你會注意到,我是通過主鍵而不是國家名來篩選 - 這個id更具體,所以你最終得到了特定的匹配,而且國家名稱是一個字段,而不是一個屬性,所以如果要按字段進行過濾,請使用:conditions而不是:with。並且如果它的一個屬性,則不能過濾它,因爲Sphinx不支持字符串屬性的過濾器。

請注意,將這三行復制粘貼到Rails控制檯中將不起作用,因爲控制檯不僅會評估行,而且會輸出結果,並輸出搜索結果調用Sphinx - 因此,窗格不會顯示沒有得到適當的應用。一個解決辦法是包括; ''在第一行的末尾,這樣得到的輸出結果爲空字符串:

search = Country.search(:with => {:sphinx_internal_id => country.id}); '' 
search.context[:panes] << ThinkingSphinx::Panes::AttributesPane 
count = search.first.sphinx_attributes['province_count'] 

如果你實際上執行了廣泛的搜索,不只是在一個特定的國家,你希望每個國家的省份都算得上,你可以在這裏停止閱讀。刪除過濾器,但確保你添加了窗格,並且你很好走。

但是,如果你只是在一個國家的記錄上運行這個......

您可以進一步簡化事情 - 你只是想計數,畢竟不是實際的國家目標:

search = Country.search(
    :with  => {:sphinx_internal_id => country.id}, 
    :middleware => ThinkingSphinx::Middlewares::RAW_ONLY 
) 
search.first['province_count'] 

真的,如果你已經有國內的對象,然後運行搜索得到省份數目的唯一目的對我來說太過分了。要麼撥打country.provinces.count,要麼使用ActiveRecord的counter_cache選項,然後在您的國家/地區模式中輸入provinces_count列 - 這無疑是長期最快的選擇。

(對不起,這個答案最終被遠遠超過我的預期 - 但它覆蓋掉了幾個不同的途徑。)

+0

非常感謝了詳細的解答。你搖滾! –