Ruby on rails 用于匹配多个habtm记录的Rails arel查询
我有如下设置:Ruby on rails 用于匹配多个habtm记录的Rails arel查询,ruby-on-rails,ruby,activerecord,has-and-belongs-to-many,arel,Ruby On Rails,Ruby,Activerecord,Has And Belongs To Many,Arel,我有如下设置: Post - has_and_belongs_to_many :tags Tag - has_and_belongs_to_many :posts 问题: 我想找到所有有社交,信息标签的帖子 在其中,我还可以使用他们的ID的假设1和2。使用arel、ActiveRecord或普通SQL 我可以使用以下方法找到具有任何标签的帖子: post_标记[:tag_id].in([1,2]) 我可以使用以下方法找到具有none标记的posts: post_标记[:tag_id]。不在(
Post
- has_and_belongs_to_many :tags
Tag
- has_and_belongs_to_many :posts
问题:
我想找到所有有社交
,信息
标签的帖子
在其中,我还可以使用他们的ID的假设1
和2
。使用arel、ActiveRecord或普通SQL
我可以使用以下方法找到具有任何标签的帖子
:
post_标记[:tag_id].in([1,2])
我可以使用以下方法找到具有none
标记的posts
:
post_标记[:tag_id]。不在([1,2])中。
但我做不到:
post_标记[:tag_id]。在所有([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))
我觉得很酷 也许你要找的是include
或eq
方法?@Fagundes做不到这一点,post_标签[:tag_id].eq(1)和(post_标签[:tag_id].eq(2))
也不起作用。