Sto usando Mongoid in un progetto Rails (entrambi 4.0.x) e ho un documento con un campo hash che memorizza alcuni dati senza schema.impostazione valori campo hash mongoid
class Thing
field :name, type: String
field :mass, type: Integer
field :info, type: Hash
end
Con questa impostazione, posso interrogare per le cose, diciamo, che hanno una chiave :endDate
in questo modo:
Thing.where("info.endDate"=>{'$exists'=>true})
E questo è tutto bello e pratico. L'utilizzo di un campo hash per questo campo :info
è piacevole perché ciò che voglio archiviare non ha uno schema fisso e varia da una cosa all'altra.
Ok, ma non è possibile utilizzare la stessa sintassi del punto sulle coppie chiave/valorenell'hash :info
. [1]
thing.set("info.endDate"=>Time.now)
solleva un errore di Mongoid::Errors::UnknownAttribute
.
Mi dice che dovrei includere Mongoid::Attributes::Dynamic
nel mio modello per fare questo, ma che non sembra giusto per me. The point of the hash field type sembra essere per consentire di lavorare con dati che non hanno uno schema fisso. Non sembra che dovrei includere uno speciale modulo "attributi dinamici" per usare i campi hash.
Così adesso, sto aggiornando i valori utilizzando regolare vecchi []
sintassi, e quindi chiamando save
sul modello, in questo modo:
thing.info[:endDate] = Time.now
thing.save
Ma un sacco di tempo accade che sarebbe stato più bello a solo $set
il valore. C'è qualche altra sintassi per l'impostazione dei valori dei campi hash? Mi sbaglio sul precedente messaggio di errore e gli attributi dinamici sono errati? Per ora sono bloccato ad aggiornare in due passaggi i campi hash?
[1] devo ammettere che di recente sono migrato da mongomapper e quindi le mie aspettative su questa sintassi sono in parte impostate dall'aver potuto farlo precedentemente in mongomapper.
penso che embeds_one, che sarà definita come Mongoid :: :: attributi dinamici, lavorerà per voi (mai provato questo approccio) –
I don non voglio un documento incorporato Voglio un campo hash perché i dati che sto memorizzando variano da documento a documento. E mongoid mi dà un modo per interrogare su coppie di chiavi/valore specifiche all'interno di quell'hash. Mi piacerebbe essere in grado di aggiornare le coppie chiave/valore in quell'Hash con la stessa facilità, usando $ set. – Bee
Non dovrebbe essere '.set (: info => {: endDate => Time.now})" È stato un po 'di tempo da quando ho lavorato con MongoDB però. –