Commit 6be51ee

mo khan <mo@mokhan.ca>
2017-02-12 21:31:15
optimize some queries.
1 parent 0e36bd4
app/controllers/profiles_controller.rb
@@ -3,6 +3,9 @@ class ProfilesController < ApplicationController
     @user = User.find_by(username: params[:id])
     @profile = @user.profile
     @program = Program.stronglifts
+    @training_histories = @program.exercises.where(id: Exercise.primary).uniq.order(name: :asc).map do |exercise|
+      @user.history_for(exercise)
+    end
   end
 
   def edit
app/models/exercise.rb
@@ -1,4 +1,8 @@
 class Exercise < ApplicationRecord
+  PRIMARY_LIFTS=["Squat", "Bench Press", "Barbell Row", "Overhead Press", "Deadlift"]
+
+  scope :primary, ->() { where(name: PRIMARY_LIFTS).order(name: :desc) }
+
   def short_name
     name.gsub(/[^A-Z]/, "")
   end
app/models/program.rb
@@ -12,12 +12,6 @@ class Program < ApplicationRecord
     slug
   end
 
-  def each_exercise(exercise_names: [])
-    exercises.where(name: exercise_names).order(name: :asc).uniq.each do |exercise|
-      yield exercise
-    end
-  end
-
   def next_routine_after(routine)
     routines.where.not(name: routine.name).first
   end
app/models/training_history.rb
@@ -41,7 +41,7 @@ class TrainingHistory
   end
 
   def to_line_chart
-    user.workouts.inject({}) do |memo, workout|
+    user.workouts.includes(:exercise_sets).inject({}) do |memo, workout|
       memo[workout.occurred_at] =
         workout.sets.for(exercise).maximum(:target_weight)
       memo
app/views/profiles/show.html.erb
@@ -1,4 +1,3 @@
-<% names = ["Squat", "Bench Press", "Barbell Row", "Overhead Press", "Deadlift"]  %>
 <div class="container">
   <div class="columns">
     <div class="column is-6 is-offset-3 content">
@@ -23,11 +22,11 @@
   <div class="columns">
     <div class="column is-8 is-offset-2">
       <div class="level">
-        <% @program.each_exercise(exercise_names: names) do |exercise| %>
-          <% personal_record = @user.personal_record_for(exercise) %>
+        <% @training_histories.each do |history| %>
+          <% personal_record = history.personal_record %>
           <div class="level-item has-text-centered">
             <div>
-              <p class="heading"><%= exercise.name %></p>
+              <p class="heading"><%= history.exercise.name %></p>
               <p class="title"><%= personal_record ? "#{personal_record} lbs" : t('.not_available') %></p>
             </div>
           </div>
@@ -38,9 +37,7 @@
 
   <div class="columns">
     <div class="column is-12 content">
-      <% @program.each_exercise(exercise_names: names) do |exercise| %>
-        <%= render @user.history_for(exercise) %>
-      <% end %>
+      <%= render @training_histories %>
     </div>
   </div>
 </div>
app/views/workouts/index.html.erb
@@ -2,13 +2,12 @@
   <div class="container">
     <div class="columns">
       <div class="column is-12">
-        <% exercises = ["Squat", "Bench Press", "Barbell Row", "Overhead Press", "Deadlift"]  %>
         <div class="tabs">
           <ul>
             <li class="<%= 'is-active' if @exercise.nil? %>">
               <%= link_to 'All', workouts_path %>
             </li>
-            <% exercises.each do |name| %>
+            <% Exercise::PRIMARY_LIFTS.each do |name| %>
               <li class="<%= 'is-active' if name == @exercise.try(:name) %>">
                 <%= link_to name, workouts_path(exercise: name) %>
               </li>
@@ -24,7 +23,7 @@
               <% if @exercise.present? %>
                   <th><abbr title="<%= @exercise.name %>"></abbr><%= @exercise.name %></th>
               <% else %>
-                <% exercises.each do |exercise_name| %>
+                <% Exercise::PRIMARY_LIFTS.each do |exercise_name| %>
                   <th><abbr title="<%= exercise_name %>"></abbr><%= exercise_name %></th>
                 <% end %>
               <% end %>
@@ -42,11 +41,8 @@
                     <%= progress.status %>
                   </td>
               <% else %>
-                <% exercises.each do |exercise_name| %>
-                  <td>
-                    <% progress = workout.progress_for(Exercise.find_by(name: exercise_name)) %>
-                    <%= progress.status %>
-                  </td>
+                <% Exercise.primary.find_each do |exercise| %>
+                  <td> <%= workout.progress_for(exercise).status %> </td>
                 <% end %>
               <% end %>
               </tr>