2011-01-24 2 views
1
query = Micropost.order("created_at desc") 
    unless params[:tag_id].blank? or params[:tag_id] == "Select a tag" 
    tags = Tag.all 
    params[:tag_id].each do |index| 
     query = tags[Integer(index) - 1].microposts.order("created_at desc") & query 
    end 
    end 

C'est le code que j'ai. Fondamentalement, les balises ont des micropoints et quand je spécifie un tableau de balises de params [: tag_id] (j'utilise un select_tag multiple), je veux l'intersection de tous ces microposts spécifiés par les balises.rails/ruby: filtrage

Ce code fonctionne lorsque le tableau n'a qu'un seul tag mais ne semble pas fonctionner avec plus de 1. Wheres the bug?

+0

J'ai "tag_id" => ["64", "6"] pour tag_id, est-ce que split est nécessaire? – SuperString

Répondre

0

Je ne sais pas si je comprends parfaitement ce que vous essayez de faire. Mais peut-être quelque chose dans ce sens est ce que vous cherchez (va dans le unless)?

Pour les postes qui ont une étiquette:

tags = Tags.where(:id => params[:tag_id]).all 
posts_with_tags = tags.map(&:microposts).flatten.uniq 

Pour les postes qui ont tous les tags:

tags = Tags.where(:id => params[:tag_id]).all 
posts_with_tags = tags.map(&:microposts).inject { |memo, elem| memo & elem } 
+0

cela fonctionne en donnant a ou b. Comment pouvez-vous modifier pour donner a et b? où a et b sont des étiquettes. – SuperString

+0

Modifié; que diriez-vous de cela? –

0

si vous voulez que l'intersection de tous Micropost avec la collection de microposts associés aux étiquettes sélectionnées vous n'avez qu'à interroger tout le micropost associé au Tag sélectionné et collecter les microposts. avec rails3

unless params[:tag_id].blank? or params[:tag_id] == "Select a tag" 
    query= Tag.where(["id in (?)",params[:tag_id]]).collect(&:microposts).uniq 
end 

peut-être que j'ai mal compris votre question, excusez-moi.

+0

Pas sûr, vous pourriez manquer un 'aplatir ' –

+0

J'ai obtenu une méthode non définie pour tous – SuperString