Rails arel запрос на совпадение нескольких записей habtm - PullRequest
0 голосов
/ 04 марта 2020

У меня есть настройки следующим образом:

Post
- has_and_belongs_to_many :tags

Tag
- has_and_belongs_to_many :posts

ПРОБЛЕМА:

Я хочу найти все сообщения, которые имеют social, informative теги в нем, я также могу использовать их ID, предположим, 1 и 2. Используя arel или ActiveRecord или обычный SQL.

Я могу найти posts, имеющий any теги, используя: post_tags[:tag_id].in([1, 2])

Я могу найти posts, имеющий none теги, используя: post_tags[:tag_id].not_in([1, 2])

Но я не могу сделать: post_tags[:tag_id].in_all([1, 2]) это потому, что одна запись не может соответствовать всем идентификаторам тегов.

Как я могу это сделать?

1 Ответ

0 голосов
/ 05 марта 2020

Нашел ответ!

posts = Arel::Table.new(:posts)
posts_tags = Arel::Table.new(:posts_tags)

tag_ids = [1, 2]

ids_predicate = 
  posts.
    project(posts[:id]).
    join(posts_tags).on(
      posts[:id].eq(posts_tags[:post_id])
    ).
    where(
      posts_tags[:tag_id].in(tag_ids)
    ).
    group(posts[:id]).
    having(
      posts_tags[:tag_id].count.eq(tag_ids.count)
    )


Post.where(posts[:id].in(ids_predicate))

Довольно круто, я думаю!

...