Daily Refactor #75: Inline Temp in Invoices#outstanding

I decided to move to another section of Invoice before I tackle the finder used in Invoice#open. I’m thinking about using a simple state machine for the different invoice states and that will require some redesign. I found it’s best to think about redesigns for time before starting on them.

The Refactoring

Today I refactored the inner logic of Invoice#outstanding to replace how a temp variable is being used.

Before

1
2
3
4
5
6
7
class Invoice  0.0
      return total
    else
      return 0.0
    end
  end
end

After

1
2
3
class Invoice  0 ? total : 0.0
  end
end

Review

This was a simple method but it was doing two things wrong:

  1. There was too much code to do a simple arithmetic operation.
  2. payments.collect(&:amount).sum was creating a bunch of ActiveRecord objects that would just get thrown away. The new code uses SQL to sum the amount field directly.

I’m thinking about changing this method so it will return negative amounts when there is an overpayment. If that happens, I can remove the ternary operation entirely.

Reference commit