我有如下设置,
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])
这是因为一条记录无法匹配所有标签ID。
我该怎么做?
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))
我认为很酷!