2010-09-29 2 views

Répondre

1

La seule façon que je peux penser à le faire en utilisant trouveurs Rails serait de faire deux requêtes et soustrayez:

class Article 
    def unused_tags 
    Tag.all - self.tags 
    end 
end 

Alternativement, vous pouvez le faire grâce à SQL (ce qui serait plus efficace puisque vous seriez seulement obtenir des lignes que vous voulez ):

query = <<-eos 
SELECT * 
FROM tags AS t 
WHERE NOT EXISTS (
    SELECT 1 
    FROM taggings 
    WHERE article_id = ? 
    AND tag_id = t.id 
) 
eos 
Tag.find_by_sql [query, article.id] 
+0

j'ai utilisé cette approche dans le cadre d'un collection_select, donc mon code ressemblait Tag.all - @ instance_article.tags – LikeMaBell

0

Voici ce que je suis venu avec:

class Article 
    def missing_tags 
     Tag.find(:all, :conditions => ['id NOT IN (SELECT taggings.tag_id FROM taggings WHERE (taggings.article_id = ?))', self.id]) 
    end 
end 

@ article.missing_tags

Questions connexes