n + 1 问题挺难搞的。 别说新手,很多老手都会被 N + 1问题困扰。
先说解决办法: 使用 includes, 在 where, 或者 find 等查询之前。
例如:
@fans = Fan.joins(:sales_checks) .includes([:sales_checks => [{:wins => :award}, :cash_desk]])
如果, fan : sales_checks = 1 : n,
sales_checks : wins = 1 : n , sales_checks : cash_desk = n : 1
wins : award = n : 1
那么,我们在查询fan的时候,要带上 sales_checks, 那么就 Fan.includes(:sales_checks)
也可以写成: Fan.includes( [:sales_checks])
如果在查询时,要带上 wins, 那么就: Fan.includes([:sales_checks => [:wins]])
如果再带上 cash_desk的话, 那么就 Fan.includes([:sales_checks => [:wins, :cash_desk]) (注意这里 cash_desk是单数, 因为一个 cash_desk对应多个 sales_checks )
如果要带上 wins的 award的话, 那么就是:
Fan.includes([:sales_checks => [{:wins => :award}]])
推荐大家使用bullet 这个gem .特别好用.