Найти все теги, которые используются - PullRequest
0 голосов
/ 30 июля 2010

Я немного застрял со следующей проблемой. У меня есть две модели:

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 ]

1 голос
/ 30 июля 2010

Вы можете использовать :joins в качестве опции при поиске вызова. Э.Г.

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

При этом будут найдены только теги, с которыми связана книга, а :select => 'distinct tags.*' гарантирует, что вы сможете извлечь каждый тег только один раз, даже если они связаны с несколькими книгами.

1 голос
/ 30 июля 2010

Вероятно, было бы проще использовать 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

Вы можете легко преобразовать это в вызов поиска.

Вы можете найти плагин типа activ_as_taggable, который обрабатывает это для вас.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...