2012-01-31 7 views
12

Ecco la situazione.Come salvare Mongoid foreign_key come numero intero o mantenere il modello principale con ID intero

user embed_one profile 
profile belongs_to city 

ho popolato una tabella città con

id as Integer 
name as String 

Ora sto facendo user.update_attributes(:profile_attributes{:city_id=>"5"}) la simulazione di un invio di un modulo del browser. Poi controllo user.profile Vedo che city_id è memorizzato come stringa. Questo rende il mio user.profile.city dare zero.

Mi chiedo quale sia la cosa giusta da fare qui. Dovrei lasciare che la mia città id sia stringa o oggetto BSON? O dovrei provare a intercettare update_attributes per rendere store_id mongoid come intero? La ragione per cui sto usando Integer come id per city è perché pensavo che la ricerca attraverso Integer fosse più veloce della ricerca attraverso la stringa. Inoltre ho tabelle statali e urbane e voglio abbinare gli id ​​in modo prevedibile, quindi non voglio usare la chiave randome BSON.

risposta

0

Sicuramente, se si utilizza Mongoid, il modo corretto è utilizzare gli oggetti BSON come ID. Ma se hai assolutamente bisogno di usare numeri interi come id di città, puoi simulare appartiene_to con un codice come questo

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

questo sembra promettente. ma possono essere molti metodi da aggiungere se il problema riguarda molte tabelle e molti attributi. Sarebbe bello se posso convertire automaticamente i parametri stringa in intero se dichiaro quegli attributi come numeri interi. Scimmia che si adatta a Mongoid, forse? – benzhang

+0

Qual è il problema con gli oggetti Bson? – rwz

+0

Sto eseguendo il porting delle tabelle degli stati della città. E voglio che l'intero sia un ID di stato, quindi la mia città si riferisce allo stato giusto. Immagino di poter usare un attributo separato come chiave esterna, quindi non mi dispiacerebbe come ID. – benzhang

Problemi correlati