Ruby is a nice little language, but I think it wouldn’t have exploded in popularity like it did without Rails. Nowadays, Ruby still seems to be the first choice of early-stage startups. A big part of that is how easy ActiveRecord makes database access.
Adrian was doing some code reviews, when he came across this line:
generate_ident_value(ident, value.to_s + rand(10).to_s)
“Um… what’s this doing?”
Well, they needed to generate unique identifiers based on a user’s name, so
joebob1, and the next
joebob2 and so on. “We were having a problem with duplicates- if a user was deleted, we were accidentally re-using their ID, so I added the call to
rand to fix that.”
Adrian took a look at the surrounding method’s previous version.
def generate_ident_value(ident, value = 1) if query.find_by(ident: ident + value.to_s) generate_ident_value(ident, value + 1) # this is the line which changed else ident + value.to_s end end
Yes- this method attempts to see if
joebob1 already exists in the database, and if it does, tries again with
joebob2, with a nice recursive call. Changing
value + 1 to
value.to_s + rand(10).to_s meant, instead of trying
d instead tryjoebob15
, thenjoebob1597`, for example.
Adrian pointed out this was an insane solution. “You’re right, we should just keep every generated
ident in a database table.”
“And when we combine it with the random
ident I added, it’ll be super unique, and we won’t have to worry about deletions!”
That’s exactly what ended up happening, despite Adrian’s protests. Because of the random approach of tacking characters on the end, the field size had to increase to 20 characters, then 30. Adrian expects it to go up to 40 before year’s end. He’s not planning to be around to see that though- he’s already made plans to move onto another position.