I’m slowly transitioning from beginning rails to an intermediate level. In my quest I’m running into problems in the amount of time it’s taking for certain queries to load.
I’m wondering if someone could point out a few things that might improve the performance of my Index Action Query.
Running Rails 3.2.0, ruby 1.9.3p194, and MySQL
Right now I’m listing all institutions (around 7000) and it’s taking 10 sec’s to load …
My Index Action
def index
@institution = Institution.includes(:state).all
end
View
<tbody>
<% @institution.each do |c| %>
<tr>
<td><%= c.company %></td>
<td><%= c.state.name %></td>
<td><%= number_to_human(c.assets) %></td>
<td><%= c.hadademo %></td>
<td><%= c.datebecameclient %></td>
<td><%= c.clientorprospect %></td>
<% if current_user.admin? %>
<td><%= link_to 'Edit', edit_institution_path(c), :class => 'btn btn-mini btn-warning' %></td>
<% end %>
</tr>
<% end %>
</tbody>
Institution Model
class Institution < ActiveRecord::Base
attr_accessible :company, :phone, :clientdate, :street, :city, :state_id, :zip, :source, :source2, :demodate1, :demodate2, :demodate3, :client, :prospect, :notcontacted, :solveid
belongs_to :state
has_many :users, :through => :company_reps
has_many :company_reps
def points
points_for_client + points_for_demodate1
end
def hadademo
if demodate3.present?
demodate3.to_date
elsif demodate2.present?
demodate2.to_date
elsif demodate1.present?
demodate1.to_date
else
"No Demo"
end
end
def datebecameclient
if clientdate.present?
clientdate.to_date
else
"Not a Client"
end
end
def clientorprospect
if client?
"Client"
elsif prospect?
"Prospect"
else
"No Contact"
end
end
def points_for_demodate1
if demodate1.present? && demodate1 >= Date.new(2012, 2, 23) or demodate2.present? && demodate2 >= Date.new(2012, 2, 23) or demodate3.present? && demodate3 >= Date.new(2012, 2, 23)
1
else
0
end
end
def clientcount
if client?
1
else
0
end
end
def points_for_client
if client?
10 / users.count
else
0
end
end
end
Using Jquery Datatables
jQuery ->
$("#institutions").dataTable
sDom: "<'row-fluid'<'span6'l><'span6'f>r>t<'row-fluid'<'span6'i><'span6'p>>"
sPaginationType: "bootstrap"
Log File
Started GET "/institutions" for xxx.xxx.xxx.xxx at 2012-11-13 02:51:47 +0000
Processing by InstitutionsController#index as HTML
Rendered layouts/_messages.html.erb (1.2ms)
Rendered institutions/index.html.erb within layouts/application (37190.3ms)
Rendered layouts/_messages.html.erb (0.1ms)
Rendered layouts/_navbar.html.erb (17.0ms)
Completed 200 OK in 43334ms (Views: 37983.7ms | ActiveRecord: 340.7ms)
Rendered institutions/index.html.erb within layouts/application (34329.1ms)
Rendered layouts/_messages.html.erb (0.1ms)
Rendered layouts/_navbar.html.erb (23.3ms)
Completed 200 OK in 38824ms (Views: 34374.8ms | ActiveRecord: 82.2ms)
If you look at the log you can see that all of the time is being spent on rendering your view, not the actual query. You will definitely want to implement view or action caching to speed this up.
The official docs will point you in the right direction.