获取多个活动记录的所有嵌套记录



假设有两种模型:UserPost,其中每个帖子属于一个用户,并且一个用户可以有多个帖子。

如果你做@user.posts,你会得到@user的所有帖子。但是,考虑到@users,有没有比Post.where(user_id: @users.map(&:id))更优雅的方法来获得@users的所有帖子?类似@users.posts的东西?

根据您对@usersActiveRecord::Relation的评论,最简单的方法是让Active Record为您解决:

Post.where(user: @users)
# SELECT "posts".* FROM "posts" WHERE "posts"."user_id" IN
#   (SELECT "user"."id" FROM "users")

这将执行单个数据库查询,并允许数据库使用子选择来完成所有繁重的工作(您的子选择可能看起来不同……在我的示例中,@users只是User.all(。

对于不使用.map获取id字段的情况,您可能需要考虑.pluck从数据库中返回一个值数组,而不获取整个记录。例如:

@users.pluck(:name)
# instead of
@users.map(&:name)

理论上,你可以在你的场景中使用.pluck,但如果你有很多用户,你会生成并发送一个包含用户ID数组的很长的SQL查询,而不是让数据库自己完成工作。。。

Post.where(user_id: @users.pluck(:id))
# SELECT "posts".* FROM "posts" WHERE "posts"."user_id" IN
#   (2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 64, 65, 66, 67, 68, 69, 70, 72, 73, 71, 74, 75, 76, 77, 78, 79, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 98, 99, 100, 101, 102, 103, 97)

最新更新