Rails有两种避免n+1问题的方法.一个涉及创建一个基于连接的大型查询来获取关联,另一个涉及对每个关联进行单独的查询.
当你做includes
次时,rails会决定使用哪种策略.它默认为单独的查询方法(预加载),除非它认为您正在使用条件或顺序中的关联中的列.因为这只适用于连接方法,所以它使用了连接方法.
Rails的启发法有时会出错,或者您可能有特定的原因 Select 一种方法而不是另一种.preload
(及其配套方法eager_load
)允许您指定希望rails使用的策略.