Back

rails高级知识: 解决 n + 1的查询问题。 使用 bullet gem (极度推荐)

发布时间: 2016-12-16 11:08:00

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 .特别好用.

Back