Can i get the id of a new object before saving it/as i save?

I have a batch-add page for users that needs to auto-generate a unique
login name for each user. What i want to do is set their login name to
be "#{first_name}_#{id}". The problem is - i can't see the id until i
save the object, but i don't want to save it until i've set the login.

Is there any way around this? Can i start creating an object and tell
it to use the id that will created when it's saved? Or do i need to
save it, get the id and then save it again?

thanks
max

There is no id until you save it to the database. Rails (and any other application) cannot tell what the next available id in the database will be.

You could try to determine the highest used id in the database table and increment this id but this does not guarantee that this id id is not used by another user in the meantime and is no more available.

-Thomas

Hi,
   There is one filter called "after_save", it will invoke a method
(let's say a foo method) after model.save! succeed (here, you already
know the id). I figure you can use the foo method to update the login
name"#{first_name}_#{id}" column in database.
   However, I still take this is somehow wired.. it updates database
twice..... unless you really have the reason to do this.

P.s. I dont think there is a good way to know the id beforehand unless
you really stored this user, cuz even you are able to know the last id
in database, you still cant guarantee that there is nobody
registering just one second before you!

Br,
MyST

myst_tt wrote:

Hi,
   There is one filter called "after_save", it will invoke a method
(let's say a foo method) after model.save! succeed (here, you already
know the id). I figure you can use the foo method to update the login
name"#{first_name}_#{id}" column in database.

Thanks myst_tt, i don't want to use a callback because the situation's a
little more complicated than i described: by default, user's logins are
set the same as their email address, but emails aren't forced to be
unique (since a group of users can share an email). So, i actually only
need to autogenerate a login some of the time (a minority of cases
actually).

What i've ended up doing (and it seems dirty) is make a temporary
probably-unique login by combining first name and time since epoch in
microseconds - rails/mysql is unlikely to ever manage 2 transactions in
one microsecond so this should be fine. Then, after saving, i call
update_attributes to set it to firstname+id, which is guaranteed to be
unique and also more memorable than firstname+microseconds_since_epoch.

Like i say, i'm not very happy with this though.