Rails如何通过关联的id包含数组来查找记录

Wil*_*rry 4 sql ruby-on-rails

课程has_and_belongs_to的has_many标签,现在给出两个标签id,[1,2],如何查找具有这两个标签的所有课程

Course.joins(:tags).where("tags.id IN (?)" [1, 2]) 将返回具有标签之一的记录,而不是我想要的记录

# app/models/course.rb
has_and_belongs_to_many :tags



# app/models/tag.rb
has_and_belongs_to_many :courses
Run Code Online (Sandbox Code Playgroud)

Vap*_*ire 6

由于您正在使用PostgreSQL,而不是使用IN运算符,您可以使用ALL运算符,如下所示:

Course.joins(:tags).where("tags.id = ALL (?)", [1, 2])
Run Code Online (Sandbox Code Playgroud)

这应该使用AND而不是OR来匹配所有ID.


Max*_*ams 3

这不是单个请求,但可能仍然与其他解决方案一样快,并且可以适用于任意数量的标签。

tag_ids = [123,456,789,876] #this will probably come from params
@tags = Tags.find(tag_ids)
course_ids = @tags.inject{|tag, next_tag| tag.course_ids & next_tag.course_ids} 
@courses = Course.find(course_ids)
Run Code Online (Sandbox Code Playgroud)