Skip to content

Commit 9237bd0

Browse files
author
Steve Polito
committed
Refactor how weekly mileage is calculated.
* Add distance_in_miles column to activities table
1 parent c02605f commit 9237bd0

5 files changed

Lines changed: 30 additions & 31 deletions

File tree

app/models/activity.rb

Lines changed: 14 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@ class Activity < ApplicationRecord
1010
has_rich_text :description
1111

1212
before_validation :calculate_duration
13+
before_save :calculate_distance_in_miles
1314
before_save :calculate_pace
1415
after_save :create_or_update_total
1516
after_destroy :subract_from_total
@@ -33,24 +34,25 @@ def require_unit_if_distance_set
3334
errors.add(:base, "Please select a unit") if self.distance.present? && self.unit.nil?
3435
end
3536

36-
def calculate_pace
37-
if self.unit.present? && self.distance.present? && self.duration.present?
37+
def calculate_distance_in_miles
38+
if self.unit.present? && self.distance.present?
3839
case self.unit
3940
when "miles"
40-
self.calculated_pace = self.duration / self.distance
41+
self.distance_in_miles = self.distance
4142
when "kilometers"
42-
converted_distance = self.distance * 0.6213712
43-
self.calculated_pace = self.duration / converted_distance
43+
self.distance_in_miles = self.distance * 0.6213712
4444
when "meters"
45-
converted_distance = self.distance * 0.0006213711985
46-
self.calculated_pace = self.duration / converted_distance
45+
self.distance_in_miles = self.distance * 0.0006213711985
4746
when "yards"
48-
converted_distance = self.distance * 0.0005681818239083977
49-
self.calculated_pace = self.duration / converted_distance
47+
self.distance_in_miles = self.distance * 0.0005681818239083977
5048
end
5149
end
5250
end
5351

52+
def calculate_pace
53+
self.calculated_pace = self.duration / self.distance_in_miles if self.distance_in_miles.present?
54+
end
55+
5456
def calculate_duration
5557
calculated_duration = 0
5658

@@ -66,23 +68,11 @@ def create_or_update_total
6668
year = self.date.to_date.cwyear
6769
starting_on = Date.commercial(year, week)
6870

69-
original_duration = self.duration
70-
71-
case self.unit
72-
when "miles"
73-
converted_distance = self.distance
74-
when "kilometers"
75-
converted_distance = self.distance * 0.6213712
76-
when "meters"
77-
converted_distance = self.distance * 0.0006213711985
78-
when "yards"
79-
converted_distance = self.distance * 0.0005681818239083977
80-
end
81-
8271
@total = Total.find_or_initialize_by(user: self.user, starting_on: starting_on, range: "week")
72+
@activities = Activity.where("date >= ?", starting_on).where("date <= ?", starting_on.end_of_week).where(user: self.user)
8373

84-
total_distance = converted_distance + @total.distance unless converted_distance.nil?
85-
total_duration = original_duration + @total.duration unless original_duration.nil?
74+
total_distance = @activities.sum(:distance_in_miles) unless @activities.empty?
75+
total_duration = @activities.sum(:duration) unless @activities.empty?
8676

8777
@total.distance = total_distance unless total_distance.nil?
8878
@total.duration = total_duration unless total_duration.nil?
Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
class AddDistanceInMilesToActivities < ActiveRecord::Migration[6.0]
2+
def change
3+
add_column :activities, :distance_in_miles, :decimal, precision: 5, scale: 2
4+
end
5+
end

db/schema.rb

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
#
1111
# It's strongly recommended that you check this file into your version control system.
1212

13-
ActiveRecord::Schema.define(version: 2020_08_22_121917) do
13+
ActiveRecord::Schema.define(version: 2020_08_26_101427) do
1414

1515
# These are extensions that must be enabled in order to support this database
1616
enable_extension "plpgsql"
@@ -60,6 +60,7 @@
6060
t.integer "hours"
6161
t.integer "minutes"
6262
t.integer "seconds"
63+
t.decimal "distance_in_miles", precision: 5, scale: 2
6364
t.index ["user_id"], name: "index_activities_on_user_id"
6465
end
6566

test/fixtures/activities.yml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,7 @@ confirmed_user_activity_<%= i %>:
99
seconds: <%= rand(1..59) %>
1010
distance: <%= rand(1..26) %>
1111
unit: miles
12+
distance_in_miles: <%= rand(1..26) %>
1213
<% end %>
1314

1415
<% 1.upto(180) do |i| %>
@@ -20,6 +21,7 @@ another_confirmed_user_activity_<%= i %>:
2021
seconds: <%= rand(1..59) %>
2122
distance: <%= rand(1..26) %>
2223
unit: miles
24+
distance_in_miles: <%= rand(1..26) %>
2325
<% end %>
2426

2527
confirmed_user_with_searchable_activity_1:
@@ -29,6 +31,7 @@ confirmed_user_with_searchable_activity_1:
2931
minutes: <%= rand(1..59) %>
3032
seconds: <%= rand(1..59) %>
3133
distance: <%= rand(1..26) %>
34+
distance_in_miles: <%= rand(1..26) %>
3235
unit: miles
3336
difficulty: easy
3437
category: run
@@ -40,6 +43,7 @@ confirmed_user_with_searchable_activity_2:
4043
minutes: <%= rand(1..59) %>
4144
seconds: <%= rand(1..59) %>
4245
distance: <%= rand(1..26) %>
46+
distance_in_miles: <%= rand(1..26) %>
4347
unit: miles
4448
difficulty: moderate
4549
category: long_run
@@ -51,6 +55,7 @@ confirmed_user_with_searchable_activity_3:
5155
minutes: <%= rand(1..59) %>
5256
seconds: <%= rand(1..59) %>
5357
distance: <%= rand(1..26) %>
58+
distance_in_miles: <%= rand(1..26) %>
5459
unit: miles
5560
difficulty: hard
5661
category: workout
@@ -62,6 +67,7 @@ confirmed_user_with_searchable_activity_4:
6267
minutes: <%= rand(1..59) %>
6368
seconds: <%= rand(1..59) %>
6469
distance: <%= rand(1..26) %>
70+
distance_in_miles: <%= rand(1..26) %>
6571
unit: miles
6672
difficulty: hard
6773
category: race

test/models/activity_test.rb

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -54,26 +54,23 @@ def setup
5454
@activity.unit = :kilometers
5555
@activity.duration = 1800
5656
@activity.save
57-
converted_distance = @activity.distance * 0.6213712
58-
pace = @activity.duration / converted_distance
57+
pace = @activity.duration / @activity.distance_in_miles
5958

6059
assert_equal pace, @activity.reload.calculated_pace
6160

6261
@activity.distance = 800
6362
@activity.unit = :meters
6463
@activity.duration = 120
6564
@activity.save
66-
converted_distance = @activity.distance * 0.0006213711985
67-
pace = @activity.duration / converted_distance
65+
pace = @activity.duration / @activity.distance_in_miles
6866

6967
assert_equal pace, @activity.reload.calculated_pace
7068

7169
@activity.distance = 600
7270
@activity.unit = :yards
7371
@activity.duration = 90
7472
@activity.save
75-
converted_distance = @activity.distance * 0.0005681818239083977
76-
pace = @activity.duration / converted_distance
73+
pace = @activity.duration / @activity.distance_in_miles
7774

7875
assert_equal pace, @activity.reload.calculated_pace
7976
end

0 commit comments

Comments
 (0)