CodeSOD: A Unique Solution


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 joebob becomes joebob1, and the next joebob becomes 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 joebob2, theyd instead tryjoebob15, thenjoebob159, 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.”

“That’s not…”

“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!”

“No, that’s…”

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.

[Advertisement]

Otter

– Provision your servers automatically without ever needing to log-in to a command prompt.

Get started today!


https://ift.tt/2IW5MhX

Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out /  Change )

Google+ photo

You are commenting using your Google+ account. Log Out /  Change )

Twitter picture

You are commenting using your Twitter account. Log Out /  Change )

Facebook photo

You are commenting using your Facebook account. Log Out /  Change )

w

Connecting to %s

%d bloggers like this: