假设我有一个用户has_many
发布的帖子和用户模型。用户模型具有name
属性。
假设我想在Post对象的查询中显示每个User#name
Post.all.each {|post| puts post.user.name}
。这是有效的,但Rails为每个N帖子发出数据库查询,以查找每个用户的名称,如
SELECT "users".* FROM "users" WHERE "users"."id" = ? LIMIT 1 [["id", 25]]
有没有办法告诉Rails它可以通过连接查找,而不是为每个实例发出单独的查询?如果我尝试使用Post.all.joins(:user).select('posts.*,users.name')
之类的标准联接,则ActiveRecord :: Relation对象会相应地返回,但在迭代期间,仍会为该行中的每个Post发出新查询。
答案 0 :(得分:3)
你可以尝试:
Post.includes(:user)
这称为急切加载,性能明智这应该只发出两个数据库查询(check docs here)
当您需要在加载时应用条件时,文档建议使用Joins
(例如,名称以's'开头的用户的帖子)