ruby-on-rails Rails如何通过包含数组的关联ID查找记录

voj3qocg  于 2023-02-20  发布在  Ruby
关注(0)|答案(3)|浏览(144)

课程has_many标签由has_and_belongs_to提供,现在给出标签的两个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
h79rfbju

h79rfbju1#

由于您使用的是PostgreSQL,因此您可以使用ALL操作符来代替IN操作符,如下所示:

Course.joins(:tags).where("tags.id = ALL (?)", [1, 2])

这应该用AND而不是OR匹配所有ID。

g6baxovj

g6baxovj2#

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

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)
vhipe2zx

vhipe2zx3#

提到@Vapire的回答

Course.joins(:tags).where("tags.id = ALL ('{?}')", [1, 2])

相关问题