What is the lightest way to load search results via Rails?
This is a question of general strategy. I've been pinging load time for a search results page I'm doctoring with sunspot_rails, and I've noticed some strange discoveries.
Sometimes results load faster, if other things are loaded with them.
The more I can avoid j开发者_开发技巧oin tables, the lighter I can tap the database.
I'm curious if I'm missing some other great staples as well. Here's an example of a search result I'm parsing with comments on the average load time that item takes if I isolate it and load it by itself.
All things Commented out = Completed in 554ms (View: 487, DB: 16)
All things loaded = Completed in 9093ms (View: 9008, DB: 37)
The Search Image
.left.search_image_holder
- if result.search_image.exists?
= image_tag result.search_image.url(:thumb)
- elsif result.logo.exists?
= image_tag result.logo.url(:thumb)
- else
= image_tag 'search_image_default.jpg'
Completed in 5791ms (View: 5728, DB: 10)
The Basic Info
.grid_3.omega
%h1<
= link_to truncate(result.name.titleize, :length => 30), organization_path(result.hq_url.blank? ? result : result.hq_url), :title => "Find out more about #{result.name} in #{result.city}"
.clear
%h3<
=h result.city.titleize
.clear
.class7
=h truncate(result.quick_description.titleize, :length => 60)
.clear
Completed in 4158ms (View: 3979, DB: 16)
Icons
.grid_4.omega.alpha
.left{:style => 'margin-right: 12px; width: 40px'}
- if result.contact_24
= link_to image_tag('24hr-icon.png'), contact_organization_path(result), :title => "This local business or organization guarentees tocontact you within 24 hours"
- else
.left{:style => 'margin-right: 12px; width: 40px'}
- if result.deals.count > 0
= link_to image_tag('hq-card-icon.png'), view_organization_deals_path(result), :title => "This local business or organization features promotions, deals, or steals"
- else
.left{:style => 'margin-right: 12px; width: 40px'}
- if result.video_count > 0
= link_to image_tag('videos-icon.png'), organization_path(result.hq_url.blank? ? result : result.hq_url, :show_video => true), :title => "This local business or organization features a video"
- else
- if result.reviews.count > 0
%a{:href => organization_reviews_path(result)}
.left.star_rating_icon
= result.rating
.clear
Completed in 4125ms (View: 3929, DB: 36)
About Text
.grid_4.omega.alpha{:style => 'height: 25px; overflow: hidden;'}
%p<
= truncate(sanitize(simple_format(result.about_us), :tags => ''), :length => 100).titleize
Completed in 4500ms (View: 4311, DB: 12)
One way you can speed things up is to pre-calculate the results of
truncate(sanitize(simple_format(result.about_us), :tags => ''), :length => 100).titleize
That way your view is just spitting out text/html. You'd have a before_save method that does the above into another field.
But that's just a guess -- it does seem that your views are loading too slowly, so this might be the cause.
精彩评论