Mongóide, ajuda com notificações
-
26-09-2019 - |
Pergunta
Eu tenho notificação incorporada no usuário. Em Mongoid, como eu conseguiria uma consulta semelhante. A consulta abaixo é feita usando o MONGDB:
MONGODB site_name_development['users'].update(
{"_id"=>BSON::ObjectId('4ce694e672357e015a000014'),
"notifications._id"=>BSON::ObjectId('4ce694e672357e015a000017')},
{"$set"=>{"notifications.0.is_active"=>true}})
Basicamente, se eu tiver o usuário foobar. Foobar tem 3 tipos de notificações. Eu gostaria de ativar uma dessas notificações ao definir o IS_Active como TRUE. Ao mesmo tempo, todas as outras notificações IS_Active devem ser definidas como falsas
Que consulta deve ser executada?
Solução
O código equivalente seria algo assim:
notification = User.find('4ce694e672357e015a000014').notifications.find('4ce694e672357e015a000017').update_attributes!(:active => true)
Se você quisesse definir os outros como inativo:
User.find('4ce694e672357e015a000014').notifications.excludes(:id => '4ce694e672357e015a000017').each { |notification| notification.update_attributes!(:active => false) }
Ou você pode fazer isso em uma linha, eu acho.
User.find('4ce694e672357e015a000014').notifications.each { |notification| notification.update_attributes!(:active => (notification.id == '4ce694e672357e015a000017' ? true : false)) }
Outras dicas
Dave está principalmente certo, mas o mais recente mongóide tem um método chamado update_all e você pode usá -lo para definir outras notificações como inativas:
User.find('4ce694e672357e015a000014').notifications.excludes(:id => '4ce694e672357e015a000017').update_all(:active => false)