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