2010-11-19 1 views
0

У меня есть уведомление, встроенное в пользователя. В Mongoid, как бы достичь аналогичного запроса. Нижеприведенный запрос выполняется с использованием Mongdb:Mongoid, помощь с уведомлениями

MONGODB site_name_development['users'].update(
    {"_id"=>BSON::ObjectId('4ce694e672357e015a000014'), 
    "notifications._id"=>BSON::ObjectId('4ce694e672357e015a000017')}, 
{"$set"=>{"notifications.0.is_active"=>true}}) 

В принципе, если у меня есть пользователь Foobar. Foobar имеет 3 типа уведомлений. Я хотел бы включить одно из этих уведомлений, установив is_active в true. В то же время для всех остальных уведомлений is_active должно быть установлено значение false

Какой запрос должен быть выполнен?

ответ

0

Эквивалентный код будет выглядеть примерно так:

notification = User.find('4ce694e672357e015a000014').notifications.find('4ce694e672357e015a000017').update_attributes!(:active => true) 

Если после этого вы хотите установить другие неактивным:

User.find('4ce694e672357e015a000014').notifications.excludes(:id => '4ce694e672357e015a000017').each { |notification| notification.update_attributes!(:active => false) } 

Или вы могли бы сделать это в одной строке, я думаю.

User.find('4ce694e672357e015a000014').notifications.each { |notification| notification.update_attributes!(:active => (notification.id == '4ce694e672357e015a000017' ? true : false)) } 
0

Дейва в основном правильно, но последняя Mongoid имеет метод с именем update_all, и вы можете использовать его для настройки других уведомлений в неактивном:

User.find('4ce694e672357e015a000014').notifications.excludes(:id => '4ce694e672357e015a000017').update_all(:active => false)