Shorter, better way to write a "query" involving virtual attributes
Some notes:


result = []: Try not to use generic names like result. Also, use plural names for collections.
init empty array + each + conditional push = select/reject. More on functional programming.
else false. In an each block the value is ignored, so this does nothing.
result[0]. People usually write result.first, but [0] is also ok.
if result.length &gt; 1. There is a serious conceptual problem here, validations should be enforced somewhere else (this is Rails, so using a validation callback). 


I'd write:

def current_invoice
  non_rescinded_invoices = invoices.select { |i| i.current_status != "rescinded" }
  if non_rescinded_invoices.size &gt; 1 # but this should be probably an AR validation
    raise("Only one non-rescinded invoice association per contract")
  else
    non_rescinded_invoices.first
  end
end