Unsuccessful attempt to properly eager load screenshots.

Currently the virtual attribute "image_url" in the screenshots model
apparently runs one SQL query each to get the packages data.
This commit is contained in:
Christoph Haas 2013-08-07 00:18:20 +02:00
parent 88dfb33721
commit 76d19f7e78
3 changed files with 14 additions and 8 deletions

View file

@ -3,16 +3,22 @@ class PackagesController < ApplicationController
@packages = Package
if params[:with_screenshots]=='yes'
@packages = @packages.joins(:screenshots).where('screenshots.approved = ?', true)
#@packages = @packages.joins(:screenshots).where('screenshots.approved = ?', true)
# Limit the packages to those that have approved screenshots.
# Also eager-load the screenshots.
@packages = @packages.includes(:screenshots).where("screenshots.approved"=>true)
#@packages = @packages.where("screenshots.approved"=>true)
end
if params[:search]
query = '%'+params[:search]+'%'
#if params[:search]
#query = '%'+params[:search]+'%'
# TODO: Index on lower(…) is missing. Does not scale.
# TODO: Consider using a serious search engine like Xapian or ElasticSearch.
@packages = @packages.where("lower(description) like lower(?) or lower(name) like lower(?)", query, query)
end
#@packages = @packages.where("lower(description) like lower(?) or lower(name) like lower(?)", query, query)
#end
#@packages = @packages.order('name').includes(:screenshots).limit(20)
@packages = @packages.order('name').limit(20)
end

View file

@ -4,7 +4,9 @@ class Screenshot < ActiveRecord::Base
# Return the URL to this screenshot.
# size: 'small' (thumbnail) or 'large' (full-size)
# (If possible serve the screenshots statically from the web server.)
#attr_accessor :image_url
def image_url(size)
# TODO: Prevents proper eager loading somehow...
"/screenshots/#{self.package.name[0]}/#{self.package.name}/#{self.id}_#{size}.png"
end
end

View file

@ -5,9 +5,7 @@
<ul>
<% @packages.each do |package| %>
<li>
<%= package.name %> <i>(<%= package.description %>)</i>
- has <%= package.screenshots.count %> screenshots
<% if package.screenshots.count>0 %>
<% if package.screenshots %>
<%= image_tag package.screenshots.first.image_url('small') %>
<% end %>
</li>