2010-04-24 9 views
0

http://github.com/collectiveidea/awesome_nested_setrails recherche une catégorie pour les sous-catégories

plugin set imbriqué impressionnant et actuellement, si je choisis une catégorie sous mon category_id pour un élément, je ne peux pas rechercher par son parent.

Category.parent 
    Category.Child 

Je choisis Category.child comme la catégorie que mon article se trouve dans. Alors maintenant, mon article a category_id de 4 stockées. Si je vais à une page dans mon application rails, disons la page Category et je suis sur la page de Category.parent, je veux aussi montrer les produits qui ont des category_id de tous les descendants.

Donc, idéalement, je veux avoir une méthode de recherche qui peut prendre en compte les descendants. Vous pouvez obtenir les descendants d'une racine en appelant root.descendants (une méthode plugin intégrée).

Comment procéder pour que je puisse interroger une recherche qui obtient les descendants d'une racine au lieu de ce qu'elle fait maintenant qui ne contient rien à moins que le produit ait un category_id spécifique de Category.parent.

J'espère que je suis clair ici. Je dois soit trouver un moyen de créer une méthode de recherche ou named_scope qui peut interroger et retourner un tableau d'objets qui ont des identifiants correspondant aux descendants d'une racine OU si j'ai d'autres options, quelles sont-elles? J'ai pensé à créer un champ dans ma table de produits comme parent_id qui peut garder une trace du parent afin que je puisse créer deux portées nommées une trouvant le truc parent et une trouvant le truc enfant et les enchaînant. Je sais que je peux créer une portée nommée pour chaque enfant et les enchaîner pour plusieurs enfants, mais cela semble un processus très fastidieux et, si vous ajoutez plus d'enfants, vous devrez spécifier plus d'étendues nommées.

//this is what i tried first 
@category = Category.find(params[:id]) 
@child_products = @category.descendants.products 

//this actually works but only for one 
@child_products = @category.descendants.first.products 

car un produit appartient à une catégorie et une catégorie a de nombreux produits. Cependant, la fonction descendante renvoie un tableau de tous les descendants. Comment puis-je filtrer à travers ceux-ci et obtenir les produits combinés?

Répondre

1

Déplacez la portée nommée vers votre modèle Product, puisque c'est ce que vous essayez d'afficher.

# product.rb  
named_scope :for_category_ids, lambda {|ids| {:conditions => {:category_id => ids}}} 

Ensuite, dans votre contrôleur:

@products = Product.for_category_ids(@category.descendants.map(&:id)) 
+0

hey jdl fait ce travail si la catégorie a plusieurs catégories de sous? Mysql :: Erreur: L'opérande doit contenir 1 colonne (s): SELECT * FROM 'products' O WH (category_id = 4,5) LIMIT 0, 4 est ce que je suis de retour. Merci pour la réponse! – jim

+0

Oui, cela devrait fonctionner pour n'importe quelle liste d'identifiants. J'ai raté un accolade dans le named_scope quand j'ai posté ceci pour la première fois. Réessayez, et voyez si cela fonctionne pour vous. – jdl

+0

ah merci jdl j'apprécie cela. J'avais changé le named_scope en named_scope: for_category_ids, lambda {| ids | {: conditions => ["category_id =?", (ids)]}} C'est pourquoi il a échoué. Merci beaucoup. – jim

Questions connexes