一个高效的SQL调用,而不是500

一个高效的SQL调用,而不是500,sql,ruby-on-rails,loops,controller,refactoring,Sql,Ruby On Rails,Loops,Controller,Refactoring,在我看来,我有一个复杂的循环,它创建500个SQL查询(以获取500本书的信息)。如何通过在控制器中加载变量来避免大量SQL查询 我当前的(伪)代码: 控制器索引操作: @books = Book.scoped.where(:client_id => @client.id).text_search(params[:query]) @feature_root = Book.multiple_summary_details_by_category( @books ) #...return

在我看来,我有一个复杂的循环,它创建500个SQL查询(以获取500本书的信息)。如何通过在控制器中加载变量来避免大量SQL查询

我当前的(伪)代码:

控制器索引操作:

@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.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
_features.html.haml

    = render :partial => "feature", :locals => { :features => @features }
  - 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

到目前为止你试过什么?使用标准ActiveRecord查询应该很容易,如中所述

而且,代替

array_of_books.sort_by{ |k, v| k["Author"] }
试试像这样的东西

Book.order("author DESC")

(这里不确定您的确切模型)让db进行排序,而不是将它们放在数组中,让ruby处理。

当然,我可以在控制器中使用普通查询来获取主集合,但它正在迭代该集合,从而生成大量查询。我的问题是如何最大限度地减少从视图层调用的查询数量。如果我在控制器中放置一个循环,每个迭代都会覆盖上一个循环,因此我无法在视图中使用它。我不太了解您的模型,但您可以在控制器中创建一个集合/数组,其中包含您需要的所有数据(我想是summary_title和summary_value),这应该可以通过一个查询实现。