假设user
有多个trees
而trees
有多个apples
。假设一个方法接受用户的id。我最终希望数据看起来像这样:
[
{ tree_id1: [apple1, apple2, apple3] },
{ tree_id2: [apple4, apple5, apple6] },
{ tree_id3: [apple9, apple8, apple7] }
]
所以我最终必须遍历用户的树并将苹果与它相关联。但是我不想每次都要点击数据库来检索树的苹果。这似乎是一个N + 1(获取用户的树,然后是所有树的苹果)。
如何有效地检索必要的记录,以便能够以我需要的数据格式组织记录?
当你进行N + 1次查询时......为什么这么糟糕?当您说在heroku上时,数据库与应用程序代码有何关系?这是网络电话吗?
答案 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)