How to DRY has_many calculations working with many records

class Person < ActiveRecord::Base

has_many :transactions

def balance

transactions.sum(:amount)

end

end

class Transaction < ActiveRecord::Base

belongs_to :person

end

Given the above, what is a good way to efficiently and DRYly find
people by balance?

Finding all records, then using the association is very slow.

Person.find(:all).select { p.balance > 100 }
A subselect is much faster, but completely duplicates the logic.
Person.find(:all,
:select => “people.*, (SELECT SUM(amount) FROM transactions WHERE
people.id=transactions.person_id) AS balance”,
:conditions => “(SELECT SUM(amount) FROM transactions WHERE
people.id=transactions.person_id) > 100”
Especially as the calculations get more complicated this starts to
become a real problem.
Thanks.
Jack Christensen