【问题标题】:Find all tags that are in use查找所有正在使用的标签
【发布时间】:2010-07-29 21:14:52
【问题描述】:

我有点被以下问题困扰。我有两个模型:

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,标签4,标签5,...

每本新书可以有多个标签。像往常一样,关系存储在连接表“books_tags”中。

如何获得至少与一本书相关的所有标签的列表?

【问题讨论】:

    标签: sql ruby-on-rails


    【解决方案1】:

    您可以在 find 调用中使用 :joins 作为选项。例如

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

    这只会找到与书籍相关联的标签,:select =&gt; 'distinct tags.*' 确保您只检索每个标签一次,即使它们与多本书相关联。

    【讨论】:

    • 谢谢,这行得通。 :select => "distinct tags.*" 成功了。更正一点:它必须是 Tag.find(:all, :select => 'distinct tags.*', :joins => :books) ...
    【解决方案2】:

    使用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
    

    你可以很容易地把它变成一个 find 调用。

    不过,您可能会找到一个acts_as_taggable 类型的插件来为您处理这个问题。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-12
      • 2011-07-01
      • 1970-01-01
      • 2013-05-21
      • 2013-04-09
      相关资源
      最近更新 更多