読者です 読者をやめる 読者になる 読者になる

kmasdaの日記

rubyとかrailsとかそれっぽいことを

bulletでn1潰してみて知ったこと

やりたいこと

bullet を入れてn+1 っちゃってる箇所を一斉駆除。 導入とかは全部書いてあるからよく読む。

github.com

特定のコントローラーアクションでskipさせたい場合は

class ApplicationController < ActionController::Base
  around_action :skip_bullet

  def skip_bullet
    Bullet.enable = false
    yield
  ensure
    Bullet.enable = true
  end
end

感じでやっとく。

はまったこと

class ApplicationController < ActionController::Base
  helper_method :current_user$
  def current_user
    @current_user ||= User.find_by(id: session[:user_id])
                          .tap { |u| session.delete(:user_id) unless u }
  end
end

class AdminController < ApplicationController
  def huga
    @piyo = current_user.includes(:user_detail)
  end
end

みたいなことしたくて、、、 nomethoderrorでちょっとはまった。 わかりづらいけどSTI実装してuserからadminを継承してadminのみ関連を持つテーブルをincludesしたい。 わけです。

includesはActiveRecord::QueryMethodsの中にあります。

http://api.rubyonrails.org/classes/ActiveRecord/QueryMethods.html#method-i-includes

んで、

ActiveRecord::Relation

where とかでやればActiveRecord::Relationで引っ張ればそこからextendされてるからincludesできる。

でも今回の場合はfind_byでレコードを引っ張ってしまっているからincludesができなかった。

結論としては bulletを黙らせた。 application_controller側でUser.includeとか書くとAdmin以外で参照した時にbulletが騒ぐしめんどう。 n1が怒っている箇所もイテレーターで回ってるわけではない。 ここに関してはそもそも何でbulletが騒いでるのかもわからない。