2012-07-29 4 views
0

필자는 500 권의 책에 대한 정보를 얻기 위해 500 개의 SQL 쿼리를 생성하는 fiddly 루프가있다. 변수를 컨트롤러에로드하여 많은 SQL 쿼리를 피할 수 있습니까?하나의 효율적인 SQL 호출 대신에

나의 현재 (의사) 코드 :

컨트롤러의 index 액션 :

@books = Book.scoped.where(:client_id => @client.id).text_search(params[:query]) 
@feature_root = Book.multiple_summary_details_by_category(@books) 
    #...returns a hash of books 
@features = @feature_root.to_a.paginate(:page => params[:page], :per_page => 4) 

index.html.haml

= render :partial => "feature", :locals => { :features => @features } 

_features.html.haml

- features.each_with_index do |(cat_name, array_of_books), i| 
    %h2 
     = cat_name 
    - array_of_books[0..10].each do |feature| 
     = link_to image_tag(feature[:cover], :class => "product_image_tiny"), book_path(feature[:book]) 
    # more code 
    - array_of_books.sort_by{ |k, v| k["Author"] }.each do |feature| 
     - feature.each do |heading,value| 
     %span.summary_title 
      = heading + ':' 
     %span.summary_value 
      = value 

답변

0

지금까지 뭐 해봤 어? http://guides.rubyonrails.org/active_record_querying.html에 설명 된대로 표준 ActiveRecord 쿼리를 사용하면 매우 쉽습니다. 또한

, 대신

array_of_books.sort_by{ |k, v| k["Author"] } 

는 DB가 아닌 정렬 배열에 이르렀하자 및 수 있도록

Book.order("author DESC") 

(여기 당신의 정확한 모델에 대해 확실하지)

같은 시도 루비가 처리해.

+0

물론 컨트롤러에서 기본 쿼리를 사용하여 주 컬렉션을 얻을 수 있지만 많은 쿼리를 생성하는 컬렉션을 반복하고 있습니다. 내 질문은 정말보기 레이어에서 호출 된 쿼리의 수를 최소화하는 방법입니다. 컨트롤러에 루프를 넣으면 각 반복이 이전 반복을 덮어 쓰므로 뷰에서 사용할 수 없습니다. – snowangel

+0

당신의 모델을 정말로 이해하지는 못했지만 컨트롤러에 하나의 쿼리로 가능해야하는 모든 데이터 (summary_title과 summary_value로 가정)가 들어있는 콜렉션/어레이를 만들면됩니다. – bento