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