Deshabilitando el autoincremento de id

Hola,

Querría poder establecer yo mismo el id de mis usuarios, de forma que
corresponda con el de otra aplicación (y base de datos). Sin embargo, no
me deja establecerlo directamente [1].

He deshabilitado la opción de autoincremento [2] pero tampoco me deja
fijar su valor. ¿Alguna idea?

Por otra parte, ¿es desaconsejable usar una clave primaria entera no
autoincremental o el autoincremento está por defecto sólo por comodidad?

Gracias!

[1]
User.create(:id=>24, …)

[2]
change_column :users, :id, :integer, :auto_increment=>false

y he comprobado que genera:
id int(11) NOT NULL default ‘0’,

Hola Hector, el uso de un id entero y autoincrementable esta presente
por
razones que dictan las buenas practicas del modelado de la base de
datos(es
lo que lei en la lista de Rails en ingles), si te es muy necesario tener
otro campo que sirva como identificador de la entidad puedes crear otro
campo tal vez nombrado “fake_id” y aplicarle una restriccion UNIQUE, al
menos es la salida que aplique en un caso que el cliente necesitaba un
codigo para que pueda identificar el tipo de producto facilmente.

Saludos.
Ruben.

El día 11/09/07, Héctor Pérez Arenas [email protected]
escribió:

On Sep 11, 2007, at 8:04 PM, Héctor Pérez Arenas wrote:

Querría poder establecer yo mismo el id de mis usuarios, de forma que
corresponda con el de otra aplicación (y base de datos). Sin
embargo, no
me deja establecerlo directamente [1].

El motivo es que id es un atributo protegido, como los que uno
declara con

attr_protected :promotion_points

Estos atributos se ignoran en mass-assignments como create() and
friends. El motivo es que de otro modo una aplicacion escrita con
idiomas normales como create(), update_attributes(), etc. estaria
expuesta a que alguien enviara un ID a manopla.

Debes asignar explicitamente:

user = User.new
user.id = compute_id_from_foreign_application()

Por otra parte, ¿es desaconsejable usar una clave primaria entera no
autoincremental o el autoincremento está por defecto sólo por
comodidad?

El autoincremento se usa por comodidad. Por lo general te da igual
que ID es asignado de manera que algo como autoincrement es util
porque automagicamente te olvidas de la generacion de IDs, que es
algo delicado por lo general porque has de garantizar unicidad, el
insert ha de ser atomico junto con la generacion del ID, etc., y mas
en un entorno multiproceso.

En el caso de tu aplicacion no da igual porque quieres reusar otros
IDs. Otra posibilidad seria simplificarte la vida de este lado, usar
lo normal, y mantener una campo foreign_application_id que sirva de
mapping entre aplicaciones, pero eso ya eres tu quien puede valorar
si aplica.

– fxn

Muchas gracias por tu estupenda respuesta Xavier. Gracias a ti también
Rubén :wink: