2014-05-14 9 views
6

mam model Service, ma zakres filtrowania usług według typu identyfikatorów usług:Myślenie Sphinx - wskaźnik do przyłączenia się do warunku (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 

tak, kiedy biegnę zakres, mam taki wynik :

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)) 
=> ... 

Jak mogę zbudować atrybut do zbudowania indeksu dla takiego zakresu?

Odpowiedz

4

Po pierwsze, będziemy chcieli typu usługi identyfikatory jako atrybut wielu wartości w definicji indeksu usługę:

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

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

a następnie można wyszukiwać i korzystać z tego atrybutu:

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

Jeśli chcesz zawinąć to w coś w rodzaju zakresu ActiveRecord, Thinking Sphinx ma swoją własną funkcjonalność zakresu (tych dwóch nie można łączyć, ponieważ ActiveRecord działa z bazami danych odpytującymi za pomocą SQL, ale zakresy Sphinx działają z zapytaniami Sphinx z SphinxQL - podobne, ale niezupełnie to samo).

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

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

A potem szukając:

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') 
Powiązane problemy