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?

Foi útil?

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)
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top