2012-01-31 14 views
12

Aquí está la situación.Cómo guardar Mongoid foreign_key como entero o mantener el modelo principal con Entero id

user embed_one profile 
profile belongs_to city 

que han poblado una mesa ciudad con

id as Integer 
name as String 

Ahora estoy haciendo user.update_attributes(:profile_attributes{:city_id=>"5"}) simulando un envío del formulario navegador. Luego verifico user.profile Veo que city_id está almacenado como una cadena. Esto hace que mi user.profile.city da cero.

Me pregunto qué es lo que hay que hacer aquí. ¿Debo permitir que mi ID de ciudad sea una cadena o un objeto BSON? ¿O debería intentar interceptar update_attributes para hacer mongoid store city_id como entero? La razón por la que estoy usando Integer como id para la ciudad es porque pensé que buscar en Integer es más rápido que buscar en la cadena. Y también tengo tablas de estado y de ciudad, y quiero hacer coincidir los identificadores de una manera predecible, así que no quiero usar la clave de randome BSON.

Respuesta

0

Seguramente, si utiliza Mongoid, la forma correcta es usar objetos BSON como identificadores. Pero si necesita usar enteros como identificadores de ciudad, puede simularlos con código como este

class Profile 
    def city 
    City.where(:id => self.city_id).last 
    end 

    def city=(new_city) 
    self.city_id = new_city.id 
    end 
end 
+0

esto parece prometedor. pero puede haber muchos métodos para agregar si el problema se relaciona con muchas tablas y muchos atributos. Sería bueno si puedo convertir automáticamente params de cadena a entero si declaro esos atributos como un entero. ¿Monkey parchar a Mongoid, tal vez? – benzhang

+0

¿Cuál es el problema con los objetos bson? – rwz

+0

Estoy portando tablas de estados de la ciudad. Y quiero que el número entero sea una identificación de estado, entonces mi ciudad se refiere al estado correcto. Supongo que puedo usar un atributo separado como clave externa, entonces no me importaría bson como id. – benzhang