2

У меня есть записи статей и тегов с отношением HABTM.HABTM multi «and» query

Мне нужно фильтровать статью по массиву тегов с запросом «и».

С тегами ниже, мне нужны все «Салями» и «Пицца», срок действия которых истек.

теги = [ «салями», «Пицца», «Устаревшие»] // Элементы могут быть любое число от 1..n

я придумал следующее, но это возвращается каждый «салями» и «Пицца», срок действия которых не истек. Это также возвращает каждые детали истекли, которые не являются ни салями Пицца

def tags_query 
    render status: 200, json: Article.includes(:tags).where('tags.name' => params[:tags]) 
end 

ответ

1

Если вы на самом деле хотите запросить с «и» для всех тэгов, которые вы могли бы сделать это следующим образом:

required_tags = ["Salami", "Pizza", "Expired"] 

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

Что он делает является:

  • Получить все статьи, которые имеют теги, которые содержат один из требуемых тегов
  • группы их, так что у нас есть, например, группа 3, когда искусство icle имеет теги «Salami», «Pizza» и «Expired» или просто группа из 2, когда в статье есть теги «Салами», «Пицца» и «Рыба».
  • Тогда возьмите только те группы с таким количеством членов, как указано в нашем массиве требуемых тегов.
+3

Единственная проблема, которую я вижу здесь, заключается в том, что логика на самом деле '(salami || pizza) && expired'? это псевдокод для отображения логики ... – jaydel

+0

Возможно, вы правы. В этом случае мой ответ неверен и будет возвращать только те статьи, которые истекли Salami Pizzas. – IngoAlbers

+0

Я думаю, что вы на правильном пути. вы можете превратить свое место в OR с первыми двумя тегами, а затем связать другой, где для тега с истекшим сроком? OR должен быть строкой SQL, с которой я бегу от ужаса в своем коде ActiveRecord. Вы можете использовать синтаксис Arel для достижения OR, но это значительно сложнее. – jaydel