Well, not quite. find(:first) is going to be nil or a Shape object. If it's nil, you can't call nil.length and if it's a Shape object, then Shape#length might actually be something else.
if result = find(:first, :conditions => ...)
# do something with the record in result
end
result_array = find(:all, :conditions => ...)
unless result_array.empty?
# do something with the records in the result_array
end
for either case, you might just return the find() and let the caller check for nil or iterate over the empty array
(Even if find(:all, ...) only gets a single match, it will still be in an array.)
I noodled with something like that but ran into problems with subsequent steps which got me sidetracked. I now have that sorted out. I apparenty had my head warped by the combination of what Rails was doing, Ruby's implied return, and the class vs instance scoping of methods and my own arbitrary attributes added to the model.
My son managed to unwarp all that, and now I can see again.