2010-07-29 82 views
0

我有點卡住了以下問題。我有兩個型號:查找所有正在使用的標籤

class Book < ActiveRecord:Base 
    has_and_belongs_to_many :tags 
end 

class Tag < ActiveRecord:Base 
    has_and_belongs_to_many :books 
end 

我可以,但絕不能在標籤表中使用特定標籤的列表:

標籤1,標籤2,標籤3,TAG4,tag5,...

每本新書都可以有多個標籤。像往常一樣,關係存儲在連接表「books_tags」中。

如何獲得至少與一本書相關的所有標籤的列表?

回答

1

您可以在查找呼叫中使用:joins作爲選項。例如。

Tag.find(:all, :select => 'distinct tags.*', :joins => :books) 

這僅發現有一本書有關的標籤和:select => 'distinct tags.*'確保您只檢索每個標籤一次,即使它們與多本書籍有關。

+0

謝謝,這個工程。 :select =>「distinct tags。*」做了訣竅。小改正:它必須是Tag.find(:all,:select =>'distinct tags。*',:joins =>:books)... – auralbee 2010-07-30 05:36:28

+0

糟糕,是的,已編輯修復。 – Shadwell 2010-07-30 11:41:02

1

使用has_many ..., :through加入方法比舊式的has_and_belongs_to_many更容易,這通常不是多功能的。

重組這一個簡單的方法是:

class Book < ActiveRecord:Base 
    has_many :book_tags 
    has_many :tags, :through => :book_tags 
end 

class Tag < ActiveRecord:Base 
    has_many :book_tags, 
    has_many :books, :through => :book_tags 
end 

class BookTag < ActiveRecord::Base 
    belongs_to :book 
    belongs_to :tag 
end 

如果你正在尋找的是至少有一本書的標籤列表,你可以使用BookTag模型檢索此。在這種情況下,您正在從連接列表中尋找不同的標記集:

SELECT DISTINCT tag_id FROM book_tags 

您可以輕鬆地將其轉換爲查找調用。

雖然你可能會發現一個acts_as_taggable類型的插件可以爲你處理這個問題。

相關問題