Rails如何通过关联的ID数组查找记录

5

这是一个关于IT技术的翻译问题。要求翻译一段关于“course”和“tags”的内容,需要用到“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

我猜它会返回所有tags.id = 1和tags.id = 2的记录。 - Pavan
可能无法工作,因为标签是一个关联对象,id 不能同时等于1和2。 - William Herry
发布您的模型及其关联。 - Pavan
你正在使用PostgreSQL吗?如果是的话,你可以使用ALL运算符。 - Vapire
https://dev59.com/6mgu5IYBdhLWcg3wP0xm - Richard Peck
显示剩余3条评论
3个回答

7

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

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

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


仍然无法工作: Course.joins(:tags).where("tags.id ALL (?)", [1, 2]): SELECT "courses".* FROM "courses" INNER JOIN "courses_tags" ON "courses_tags"."course_id" = "courses"."id" INNER JOIN "tags" ON "tags"."id" = "courses_tags"."tag_id" WHERE (tags.id ALL (1,2)) ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near "ALL" LINE 1: ...gs"."id" = "courses_tags"."tag_id" WHERE (tags.id ALL (1,2)) ^ - William Herry
谢谢,我忘了在 where 字符串后面加逗号。 - Vapire
我认为你需要使用运算符,同时我已经编辑了我的答案。 - Vapire
使用 PostgreSQL 数组语法: Course.joins(:tags).where("tags.id = ALL (?)", '{1, 2}') - Vlad Hilko

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)

这个有效,谢谢。我会等一段时间看看是否有更好的答案。 - William Herry

0

参考@Vapire的回答

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接