2017-04-18 26 views
1

현재로드하는 데 11 초 걸리는 페이지가 있습니다. 글 머리 기호 젬을 사용하여 N + 1 쿼리가 발생한 위치를 찾을 수 있습니다. 그게 내 일부 출력을 제공하지만, 정말 그걸로 뭘 해야할지 모르겠다. 연관되어N + 1을 멈추기 위해 열심히로드하기 - 레일

GET /events/1679/dashboard 
USE eager loading detected 
    RSVP => [:tickets] 
    Add to your finder: :includes => [:tickets] 
Call stack 
    /Users/cameronbass/Desktop/Work/blackbird-rsvp/app/decorators/rsvp_decorator.rb:54:in `tickets?' 
    /Users/cameronbass/Desktop/Work/blackbird-rsvp/app/views/accepted_rsvps/_list.html.erb:33:in `block in _app_views_accepted_rsvps__list_html_erb___1211423417683052584_70339569780320' 

그리고이 선 다음

def tickets? 
    rsvp.tickets.any? 
end 

에 넣어달라고 말하고 : 여기에 총알의 출력은

has_many :tickets, through: :attendees 

attendee.rb

has_one :ticket 
+1

일반적으로 이것은 이러한 것들의 목록을 반복하고 각각에 '티켓'이라고 부르는 것을 말합니다. 이 코드는 표시되지 않지만 아마도이 목록이 무엇이든간에 여러 가지 목록을 가지고있을 것입니다. – tadman

+1

로그를보세요! 한 요청에 대해 데이터베이스가 여러 번 히트되는 것을 볼 때 아마 N + 1 상황이 발생할 것입니다. 열망하는로드를 사용하여 db를 한 번만 누르면 관련 테이블을 가져 와서 레코드를로드 할 수 있습니다. – bkunzi01

+0

이런 질문을 볼 때, 나는이 답변에 링크해야한다고 느낀다 : http://stackoverflow.com/a/26251892/525478. YMMV –

답변

3

글 머리 기호를 사용하면 장소가 인 경우 동일한 연결의 번을 여러 번 감지했습니다. 이 아니므로 열정적 인로드를 추가해야하는 장소에 있습니다.

_list.html.erb 템플릿의 어느 곳에서나 당신은 아마도 당신의 RSVP (무엇이든지)를 트래버스하고, 각 회신마다 당신이 tickets 연관을 호출함으로써 티켓이 있는지 여부를 결정하려고합니다. 템플릿에서 통과 당신이 (당신의 AcceptedRSVPs 컨트롤러에서 아마 어딘가에) 참석 여부에 대한 변수를 설정 파인더에 include(:tickets)을 추가 할 수

총알 조언. 일단 완료되면 각 RSVP가 티켓을 찾기 위해 실행하는 SQL이 없으므로 N + 1 문제를 제거 할 수 있습니다.