2014-05-14 5 views
6

मैं मॉडल Service है शर्त के साथ शामिल होने के लिए सूचकांक, यह सेवा प्रकार आईडी द्वारा सेवाओं फिल्टर करने के लिए गुंजाइश है:में सोच रही थी स्फिंक्स (has_and_belongs_to_many)

class Service < ActiveRecord::Base 
    has_and_belongs_to_many :service_types 

    scope :by_service_types, -> ids { joins(:service_types).where('service_types_services.service_type_id in (?)', ids) } 
end 

class ServiceType < ActiveRecord::Base 
    has_and_belongs_to_many :services 
end 

तो, जब मैं गुंजाइश चलाने के लिए, मैं इस तरह के परिणाम प्राप्त :

Service.by_service_types([54]) 
    Service Load (0.8ms) SELECT "services".* FROM "services" INNER JOIN "service_types_services" ON "service_types_services"."service_id" = "services"."id" INNER JOIN "service_types" ON "service_types"."id" = "service_types_services"."service_type_id" WHERE "services"."deleted" = 'f' AND (service_types_services.service_type_id in (54)) 
=> ... 

मैं इस तरह के दायरे के लिए सूचकांक बनाने के लिए विशेषता कैसे बना सकता हूं?

उत्तर

4

सबसे पहले, आप अपनी सेवा सूचकांक परिभाषा एक बहु मूल्य विशेषता के रूप में सेवा प्रकार आईडी चाहता हूँ:

ThinkingSphinx::Index.define(:service, :with => :active_record) do 
    # ... existing index definition 

    has service_types.id, :as => :service_type_ids 
end 

और फिर आप खोज और उस विशेषता का उपयोग कर सकते हैं:

Service.search(:with => {:service_type_ids => 54}) 

हैं आप इसे ActiveRecord स्कोप जैसे कुछ में लपेटना चाहते हैं, सोचते हुए स्फिंक्स की अपनी स्कोप कार्यक्षमता है (दोनों को संयुक्त नहीं किया जा सकता है, क्योंकि ActiveRecord एसक्यूएल के साथ पूछताछ डेटाबेस के साथ काम करता है, लेकिन स्फिंक्स स्कोप स्फिंक्स के साथ स्पिंक्स पूछताछ के साथ काम करते हैं - समान नहीं, लेकिन काफी नहीं वही)।

# include this in your model: 
include ThinkingSphinx::Scopes 

sphinx_scope(:search_by_service_type) { |ids| 
    {:with => {:service_type_ids => ids}} 
} 

और फिर खोज:

Service.search_by_service_type(54) 
# You can chain further search arguments onto the scope: 
Service.search_by_service_type(54).search('foo', :order => 'created_at DESC') 
संबंधित मुद्दे