2010-04-21 7 views
0

Je développe une application où j'ai des produits et des catégories. La catégorie has_many propriétés et chaque propriété a une liste de valeurs possibles. Une fois qu'une catégorie est définie sur le produit, toutes les propriétés s'affichent dans le formulaire et l'utilisateur peut définir cette propriété sur l'une des valeurs possibles des propriétés.Champs dynamiques avec Thinking Sphinx

Ma question est:

Est-il possible de penser Sphinx pour filtrer les produits par le biais d'une propriété et valeur de la propriété ex:

:with => {:property_id => property_value} 

S'il est possible, quelle est la meilleure façon de mettre en œuvre ce? Sinon, y a-t-il une autre bibliothèque pour résoudre ce problème?

Merci

/Ola

Répondre

0

Essayez ceci:

Ajouter ce qui suit à votre define_index:

has properties(:id), :as => :property_ids 

Ensuite, vous pouvez utiliser :with/:without comme:

:with => {:property_ids => property_value} 
+1

Il est un peu plus complexe que cela. J'ai besoin de filtrer sur la valeur de la propriété, pas sur l'identifiant de la propriété. –

1

Une approche consiste à stocker le property_id en tant qu'attribut à valeurs multiples.

class Product < ActivRecord::Base 
    has_one :category 
    has_many :properties, :through => :category 

    KVP = "###" 
    define_index do 
    has properties("CONCAT(`properties`.`key`, \"%s\", `properties`.`value`)" % 
      KVP, :as => :category_key_value 
    end 

    def search_with_properties keys, with_attr={}, p={} 
    wp = (with_attr||{}).dup 
    values = p.map{|k, v| "#{k}#{KVP}#{v}"} unless p.empty? 
    wp = wp.merge({:category_key_value => values}) unless values.empty? 
    search keys, :with => wp 
    end 
end 

class Category < ActivRecord::Base 
    belongs_to :product 
    has_many :properties 
end 

class Property < ActivRecord::Base 
    belongs_to :Category 
    #key E.g: region 
    #value E.g: South West 
end 

Maintenant, vous pouvez émettre des commandes suivantes de recherche:

Product.search_with_properties("XYZ", nil, :region => "South West") 
+0

Il semble que je n'ai pas accès à la méthode category_key_values ​​lorsque je pense à des index Sphinx. Colonne inconnue 'ads.category_key_values' dans 'liste des champs' –

+0

Mise à jour de ma réponse, jetez un oeil. –

Questions connexes