나는 2.3로 작성된 오래된 레일 앱을 유지 관리하고있다. 비효율적 인 선택으로 인해 기존 N + 1 문제가 발생합니다.레일 2.3의 조건으로 열심히 부하를 가진 컬렉션을 '다시로드하는 방법'?
먼저 스위치의 다른 find_by_sql 문과 함께 위젯 모음이로드됩니다. 그 후 Widget.association.select가 N + 1을 수행합니다. 이 select 루프를 find_by_sql의 위젯 ID를 기반으로 열심히 위젯로드로 대체하려고합니다. 나는 아마 이것들을 하나의 쿼리로 결합 할 수 있다는 것을 알았지 만, find_by_sql은 상당히 복잡하기 때문에이 시점에서 나는 2 개의 쿼리를 최적화하기위한 작은 단계를 취하고있다.
그래서 기본적으로 나는
@widgets = Widget.find_by_sql...
을 가지고 있고 지금은 ID의 배열을 얻기 위해 당신은 collect
또는 map
를 사용할 수
@widgets_and_more = Widget.find(:all, :include => :widget_assoc, :conditions => ["widgets.id IN ", @widgets.ids])