Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 用于匹配多个habtm记录的Rails arel查询_Ruby On Rails_Ruby_Activerecord_Has And Belongs To Many_Arel - Fatal编程技术网

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))
也不起作用。