2009-09-12 100 views
1

我有一本書模型和一個標記模型以及一個連接模型。該書模型通過連接模型有許多標籤。如何找到同時具有'A'和'B'標籤的書籍?加入一對多查詢

這適用於只是一個:

Book.all(:joins => 'tags', :conditions => {'tags.name' => 'A'}) 

本工程爲A或B(或似乎):

Book.all(:joins => 'tags', :conditions => {'tags.name' => ['A','B']}) 

但我想找到所有的A和B的書籍。

+0

您是否可以包含圖書,標籤和您的加盟模式以進行澄清? – Yaraher 2009-09-13 16:07:27

回答

0

這裏有一個辦法:找到所有的書籍和擺脫那些沒有標記A和B

書10
+0

運行上述查詢的結果表明執行了OR。結果中包含帶有標籤的圖書,但只能包含帶有兩個標籤的圖書。 – LDK 2009-09-13 15:25:24

0

這應做到:

Book.all(:joins => 'tags', :conditions => "tags.name = 'A' and tags.name = 'B'") 
+0

這將評估爲零,事實上,當我運行它它返回一個空數組。 – LDK 2009-09-13 15:24:06

0

我能想到的唯一辦法做到這一點使用上的連接表,一個是要共同每個標籤的多個連接。這不能很好地擴展,但對兩個工作正常。你想,假設你的加入模型中的查詢是帶一個外鍵book_id引用的Tagging:

SELECT DISTINCT books.* FROM books 
    INNER JOIN taggings t1 ON t1.book_id = book.id 
    INNER JOIN taggings t2 ON t2.book_id = book.id 
WHERE t1.id = (SELECT id FROM tags WHERE name = 'A') 
    AND t2.id = (SELECT id FROM tags WHERE name = 'B') 

你可以嘗試利用此功能查找方法,好運:)可能更容易,只需使用的find_by_sql,就像這樣:

Book.find_by_sql(["SELECT DISTINCT books.* FROM books 
     INNER JOIN taggings t1 ON t1.book_id = book.id 
     INNER JOIN taggings t2 ON t2.book_id = book.id 
    WHERE t1.id = (SELECT id FROM tags WHERE name = ?) 
     AND t2.id = (SELECT id FROM tags WHERE name = ?)", 'A', 'B') 

這假定tags.name是唯一的。

+0

有趣的是,不幸的是我有兩個以上的標籤,所以這種方法很多都不是那麼幹淨。 – LDK 2009-09-20 00:12:31