This might be a bit silly because there are like a thousand ways to do this, but I'm struggling to come up with one that I like. I feel like this should fit in one line, but I don't like re-using read_attribute(:length) lots and I don't like the below because it's not that clear.
# returns a human-readable string in the format Xh Ym
def length
# length stored in seconds
len = read_attribute(:length)
"#{(len/60/60).floor}h #{len.modulo(60*60)/60}m" unless len.nil?
end
3 Answers 3
In one line
def length
(len = read_attribute(:length)) && "#{(len/60/60).floor}h #{len.modulo(60*60)/60}m"
end
If len == nil
return nil
, if not - second operand
One-liners are nice, but sometimes it's better just to split lines. For example:
def length
if (len = read_attribute(:length))
"#{(len/60/60).floor}h #{len.modulo(60*60)/60}m"
end
end
If you really like compact code that deals with nil values, you can work with the idea of maybe
's ick:
def length
read_attribute(:length).maybe { |len| "#{(len/60/60).floor}h #{len.modulo(60*60)/60}m" }
end
Assuming that len is an integer you won't need to use floor. You can do something like this
"#{len/3600}h #{(len/60) % 60}m" unless len.nil?