Problemas con herencia y cambio de clase

Buenos días a todos,
estoy utilizando herencia para tener varios roles de usuarios en mi
aplicación.

class User < ActiveRecord::Base
end

class Agent < User
end

class Manager < User
end

Todo esto funciona bien, y puedo crear tanto usuarios con type -> Agent
ó Manager. El problema que me encuentro es como poder cambiar el tipo de
un usuario ya existente, imaginar que he creado el usuario A del tipo
Agent.

@user = Agent.new(params[:agent])

Pero ahora decido cambiar el rol de este usuario de Agent a Manager.

@user = User.find(1)
@user.update_attribute(:type, ‘Manager’)

Esto no me hace ni caso, no consigo de ninguna de las maneras cambiarlo.
Incluso por consola intento ver que pasa:

user = User.find(1)
user.class
=> Agent

user.type = ‘Manager’
=> “Manager”

user.save
=> true

Y si vuelvo a comprobar:

user.class
=> Agent

No me hace ni caso !

Si vuelves a hacer el find, user.class te devolverá ‘Manager’.

Salu2,

Javi

El 18/02/07, Jose [email protected]
escribió:> Buenos días a todos,

No Javier,
de hecho miro la base de datos con el phpMyAdmin para ver el valor de
Type y no cambia.

Javier Vidal P. wrote:

Si vuelves a hacer el find, user.class te devolver� ‘Manager’.

Salu2,

Javi

El 18/02/07, Jose [email protected]
escribi�:> Buenos d�as a todos,

Hola,

user.class

=> Agent

user.type = ‘Manager’

user.class

=> Agent

No me hace ni caso !

Esta prueba la estás haciendo mal. Cuando recuperas de la base de datos,
el ORM mapea el objeto a una instancia de la clase Agent en función del
campo type recuperado. Una vez tienes esta variable apuntando a esa
clase, por mucho que le cambies los valores de sus atributos, no vas a
conseguir que la clase cambie, así que te va a parecer que no ha
cambiado nada cuando realmente en la base de datos sí ha cambiado.

Lo puedes comprobar si después de hacer el save tratas de hacer un
user.reload te dará un error porque no es capaz de encontrar ya un Agent
con ese ID. Y si vuelves a hacer el find, debería mapearte al tipo
Manager directamente. De hecho, si una vez cambiado user le dices en la
consola “user” directamente, te debería mostrar los campos de user con
el valor modificado.

Si no te funciona, se me ocurre que quizás rails se esté liando con el
campo .type (lo mismo que le pasa a veces con el campo id, que intenta
leer el campo id/type del object y no la columna del modelo). Podrías
intentar a hacer user[‘type’] en lugar de user.type, pero por lo menos
en la 1.2.1 no me da problemas cambiando el .type directamente.

En cuanto a que en la db no ves el valor cambiado, a veces pasa que se
entra desde la consola en modo sandbox de forma que todo lo que cambias
se ejecuta en una transacción que se hace rollback al salir, y por eso
en este caso no verías cambios al entrar por phpmyadmin usando otra
conexión.

Suerte,

javier ramirez

Yo creo que rails se está rayando, ya que cuando simplemente hago:

@user = User.find(:first, :conditions => [‘login = ?’, params[:login])

Lo traduce a:

SELECT * FROM users WHERE (LOWER(users.login) = ‘supervisor’) AND (
(users.type = ‘Manager’ ) ) LIMIT 1

Ojo!!!
Y no hago el find como:

@user = Manager.find

Sino como:

@user = User.find