查找正在使用的所有标签

时间:2010-07-29 21:14:53

标签: sql ruby-on-rails

我有点陷入以下问题。我有两个模型:

class Book < ActiveRecord:Base
  has_and_belongs_to_many :tags
end

class Tag < ActiveRecord:Base
  has_and_belongs_to_many :books
end

我有一个特定标签列表,可以但不能在标签表中使用:

  

tag1,tag2,tag3,tag4,tag5,...

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

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

2 个答案:

答案 0 :(得分: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类型插件。

答案 1 :(得分:1)

您可以在查找通话中使用:joins作为选项。 E.g。

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

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