O problema com o campo Hash é que ele pode ser dinâmico o quanto você quiser. Portanto, para evitar poluir seu esquema de banco de dados com campos não intencionais causados por bugs em seu código, essa funcionalidade é desabilitada por padrão.
Não, você não está preso usando atualizações em duas etapas para seus hashes!
[],[]=são os atalhos para
read_attribute()
e write_attribute()
e deve ser usado se você não incluir Mongoid::Attributes::Dynamic
. Se você tentar usar $set
sem habilitar atributos dinâmicos, você receberá um erro sem método porque não vê seus atributos dinâmicos como atributos definidos. Se você ler a fonte de Mongoid::Atributos::Dinâmico então você descobriria que isso é necessário para adicionar a funcionalidade de atributos dinâmicos.
Para atualizar os valores incluindo
Mongoid::Attributes::Dynamic
você precisa seguir estes passos:thing = Thing.first
thing.set("info.endDate" => Time.now)
thing.reload # This will update the current variable
Caso contrário, se você precisar, pode pular isso facilmente e fazer a atualização de valor pelo método de 2 etapas
Espero que isso esclareça sua dúvida.
Fonte:
Campos dinâmicos mongoides do Rails - sem erro de método
Atributos dinâmicos com Rails e Mongoid