Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/73.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何以最有效的方式获取所有嵌套记录。轨道_Sql_Ruby On Rails_Activerecord - Fatal编程技术网

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功能?