Sql 如何以最有效的方式获取所有嵌套记录。轨道
假设一个Sql 如何以最有效的方式获取所有嵌套记录。轨道,sql,ruby-on-rails,activerecord,Sql,Ruby On Rails,Activerecord,假设一个用户有许多树,树有许多苹果。假设一个方法接收用户id。我最终希望数据看起来像这样: [ { tree_id1: [apple1, apple2, apple3] }, { tree_id2: [apple4, apple5, apple6] }, { tree_id3: [apple9, apple8, apple7] } ] 因此,我最终必须遍历用户的树,并将苹果与之关联。但我不想每次都要点击数据库来检索树上的苹果。这似乎是一个N+1(获取用户的树,然后获取树的所有
用户
有许多树
,树
有许多苹果
。假设一个方法接收用户id。我最终希望数据看起来像这样:
[
{ tree_id1: [apple1, apple2, apple3] },
{ tree_id2: [apple4, apple5, apple6] },
{ tree_id3: [apple9, apple8, apple7] }
]
因此,我最终必须遍历用户的树,并将苹果与之关联。但我不想每次都要点击数据库来检索树上的苹果。这似乎是一个N+1(获取用户的树,然后获取树的所有苹果)
如何才能高效地检索必要的记录,以便以所需的数据格式组织记录
当您进行N+1查询时。。。为什么这么糟糕?当你说你在heroku上时,与应用程序代码相关的数据库在哪里?是网络呼叫吗?您可以通过应用 您可以使用
includes
来执行此操作,如打击:
User.includes(trees::apples)
您可以使用即时加载
users = User.includes(trees: :apples)
它将只触发三个查询,而不是触发N+1个查询
1) Select * from users
2) Select * from trees where user_id IN [ids_of_users_fetch_from_above_query]
2) Select * from apples where apple_id IN [ids_of_trees_fetch_from_above_query]
所以现在当你写作的时候
users.first.apples
当您获取用户时,记录已经加载,因此不会触发任何查询
这是Rails的特性所以一旦我这么做了,到底发生了什么?所有记录都在内存中,所以如果我调用
tree.apples
它不会命中数据库?这是rails功能还是sql功能?