一个高效的SQL调用,而不是500
在我看来,我有一个复杂的循环,它创建500个SQL查询(以获取500本书的信息)。如何通过在控制器中加载变量来避免大量SQL查询 我当前的(伪)代码: 控制器索引操作:一个高效的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
@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),这应该可以通过一个查询实现。