2012-12-27 2 views
1

레일에서는 일반적으로 뷰 (또는 헬퍼)에서 일부 쿼리가 실행되는 경우가 있습니다. 예를 들어 내 페이지에 선택 상자를 추가하려면 다음과 같이 작성하십시오.레일 뷰에서 쿼리를 사용하면 성능에 미치는 영향

<%= collection_select(:person, :city_id, City.all, :id, :name) %> 

이 예제는 Rails Guides에서 가져온 것입니다. 여기에서는 인스턴스 변수 대신 "City.all"을 사용했습니다. 제 질문은 이것이 내 응용 프로그램의 성능에 어떤 영향을 미칠까요?

같은 일을하는 다음과 같은 좋은 방법이 있습니까? 그리고 왜? 뷰에서

@cities = City.all 

그리고 : 컨트롤러에서

<%= collection_select(:person, :city_id, @cities, :id, :name) %> 

답변

1

그것은, 같은 응용 프로그램에 더 특별한 영향을주지 않습니다 그 여부를보기 또는 시스템 때문에 컨트롤러 그것도 똑같은 -> 쿼리가 발행됩니다. 하지만 간단히 권장하지 않는 방식으로 코드 분리 및 모듈성이라는 전체 개념이 토스 (toss)로 이어집니다.

이 이유 때문에보기에서 쿼리를 통해 인스턴스 변수를 사용하는 것이 좋습니다.

1

실제로 차이가 있으며 때로는 필수적입니다. 렌더링 속도 (응답 시간)는 주입 된 집중적 인 쿼리에 크게 의존합니다. 왜 이런 일이 일어나는지 설명하는 것이 지루할 수 있지만, 규칙을 취하는 것이 더 쉽습니다. ActionView가 준비된 (메모리에로드 된) 객체와 함께 작동하는 방식으로 애플리케이션을 디자인하십시오.

그리고 저는 ActionView가 Rails의 큰 병목 (특히 ERB 컴파일)이라고 생각합니다.

+0

왜 그런지 설명해 주시겠습니까? – Vignesh

+0

ActionView 인스턴스는 요청이 전송되는 즉시 즉시 초기화됩니다. 모든 변수는 메소드가 실행될 때 동시에 초기화됩니다. 따라서 런타임에는 경제가 있습니다. 그러나 내부에 무언가 무거운 템플릿이 있으면 모든 작업이 일관되고 렌더링은 응답 본문을 생성하는 데 더 많은 시간을 소비합니다. 무거운 쿼리로 몇 번 테스트 해봤는데 응답 시간의 차이가 명백합니다 (2-3 배 느림). –

관련 문제