2010-11-05 24 views
3

Je souhaite effectuer une recherche sur plusieurs modèles et filtrer selon un certain attribut que certains modèles possèdent et d'autres non. Je veux que les modèles avec l'attribut soient filtrés, mais ceux qui n'en ont pas sont ignorés.Penser la recherche à l'échelle de l'application Sphinx: filtrer par un attribut qui n'existe que dans certains modèles

Actuellement, seuls les modèles avec l'attribut renverront les résultats. Existe-t-il un moyen de faire en sorte que les autres modèles retournent les résultats en ignorant le filtre d'attribut?

Répondre

5

J'ai trouvé un moyen de le faire. Sur les indices des modèles qui ne disposent pas d'un tel attribut, un mannequin peut être créé comme ceci:

has "0", :type => :integer, :as => :the_attribute_name 

Ensuite, lorsque vous effectuez la recherche de l'application à l'échelle:

@results = ThinkingSphinx.search(@search_term, 
    :with => {:the_attribute_name => [@the_attribute_value, 0]} 
) 

BTW, cela suppose qu'une valeur nulle n'est pas autorisée sur les modèles qui ont cet attribut. Si zéro est un attribut valide dans ces modèles, une autre valeur (par exemple 9999999) peut être utilisée. Sachez que les attributs ne peuvent pas accepter les entiers négatifs.

0

Je devais le faire dans un default_sphinx_scope et l'application étant trop grande je ne pouvais pas vérifier chaque modèle et le faire pour ceux qui n'ont pas l'attribut. Donc, je l'ai fait avec ce qui suit:

class User 

    ... 

    sphinx_scope(:active_only) do 
    if self.respond_to?(:status) 
     {:with => {:status => true}} 
    else 
     {} 
    end 
    end 
    default_sphinx_scope(:active_only) 

    ... 
end 

Il a appliqué la scope que lorsque la colonne status était présent. À votre santé.