欢迎来到cool的博客
7

Music box

Click to Start

点击头像播放音乐
新博客链接

使用bullet gem调试 n + 1 问题, 优化数据库查询

refer to:  https://github.com/flyerhzm/bullet

1. gem "bullet", :group => "development"

2. $ bundle install

3. 编辑 config/environments/development.rb

加上: 配置: (具体位置, 放到与其他config 位置相同的地方) 
	config.after_initialize do
		Bullet.enable = true
		Bullet.alert = true
		Bullet.bullet_logger = true
		Bullet.console = true
		Bullet.rails_logger = true
		Bullet.add_footer = true
	end

使用时, 对于erb 页面,会自动提示消息。 对于json 等接口,直接查看  log/bullet.log 就可以。 能给出解决方案。特别好用。

 

人肉解决n + 1问题

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

 

返回列表