2010-11-19 69 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)