我有点陷入以下问题。我有两个模型:
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”中。
如何获取至少与一本书相关的所有标签的列表?
答案 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.*'
确保您只检索每个标记一次,即使它们与多本图书相关联。