如何以最有效的方式获取所有嵌套记录。轨道

时间:2017-09-20 15:30:28

标签: sql ruby-on-rails activerecord

假设user有多个treestrees有多个apples。假设一个方法接受用户的id。我最终希望数据看起来像这样:

[
   { tree_id1: [apple1, apple2, apple3] },
   { tree_id2: [apple4, apple5, apple6] },
   { tree_id3: [apple9, apple8, apple7] }
]

所以我最终必须遍历用户的树并将苹果与它相关联。但是我不想每次都要点击数据库来检索树的苹果。这似乎是一个N + 1(获取用户的树,然后是所有树的苹果)。

如何有效地检索必要的记录,以便能够以我需要的数据格式组织记录?

当你进行N + 1次查询时......为什么这么糟糕?当您说在heroku上时,数据库与应用程序代码有何关系?这是网络电话吗?

2 个答案:

答案 0 :(得分:1)

您可以使用预先加载

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的特色

答案 1 :(得分:0)

您可以通过应用eager loading

来克服N + 1

你可以像打击一样使用includes

User.includes(trees: :apples)