2015-05-21 3 views
1

У меня есть модель статьи, которая has_and_belongs_to_many Tag.Выберите статью, в которой есть ВСЕ теги (через отношение habtm)

Я хочу, чтобы найти статьи, имеет теги, указанные, например, теги = [ "tag1 "tag2", "тег" 3]

Было бы хорошо, чтобы все в SQL запросе. (Postgresql используется)

.

похоже, что это будет хорошо, чтобы воспользоваться помощью PostGreSQL массивы

в настоящее время, я смотрю в этот подход:

select "articles".*, 
(
    select array(
    select tags.name from tags 
    inner join articles_tags on articles_tags.tag_id = tags.id and articles_tags.article_id = articles.id 
) 
) as tags 
FROM "articles" 

Я пытаюсь сделать теги & & ARRAY [?] И передавать теги, но он не работает, потому что «теги не являются столбцом».

Возможно, вы можете порекомендовать элегантное решение для рельсов.

UPD

Похоже, это SQL делает то, что нужно, но это выглядит не очень Рельсы дружественный:

select articles.* 
from articles 
where articles.id in (
    select t.id 
    from (
    select articles.id, array_agg(articles_tags.tag_id) as tag_ids 
    from articles 
    inner join articles_tags on articles_tags.article_id = articles.id 
    group by articles.id 
) as t 
    where t.tag_ids @> array[2,3] 
) 

Есть ли способ сделать это Rails путь?

Спасибо!

ответ

2

Вы могли бы попробовать что-то вроде этого:

required_tags = ["tag1", "tag2", "tag3"] 

Article.joins(:tags) 
     .where(tags: { name: required_tags }) 
     .group('articles.id') 
     .having('count(*) = ?', required_tags.count) 

Что она делает это:

  • Получить все статьи, которые имеют теги
  • , которые содержат один из требуемых тегов
  • Group им , так что у нас есть, например, группа из 3, когда в статье есть теги «tag1», «tag2» и «tag3» или просто группа из 2, когда в статье есть теги «tag1», «tag2» и «tag2», Вкладка4" .
  • Тогда возьмите только те группы с таким количеством членов, как указано в нашем массиве требуемых тегов.

Могут быть лучшие способы достижения желаемого, но это действительно единственное решение, о котором я мог думать в данный момент.

+0

Вы уверены, что это работает? –

+0

Это должно сработать. Я быстро проверил свои данные и вернул правильные результаты. – IngoAlbers

+0

Но он может дать неправильный результат, например, если теги статьи ["tag1", "tag4", "tag5"], он все равно вернет эту статью. –

Смежные вопросы