使用mongodb进行简单的布尔数据更新?

时间:2011-01-16 05:17:46

标签: ruby-on-rails mongodb boolean toggle mongoid

我正在使用Rails和mongoid来使用mongodb。

使用Active:Record时,通常在rails中,您可以访问方法.toggle!它只是允许你反转数据库中布尔字段的值。

不幸的是,这种方法不适用于mongoDB:

user = User.first
user.toggle!(:admin)
NoMethodError: undefined method `toggle!' for #<User:0x00000100eee700>

这很不幸......而且愚蠢的我没有看到如何在没有复杂代码的情况下出行......

关于如何简明扼要地获得相同结果的任何建议?

谢谢,

Alex

ps:其中一个问题是,当我想要修改字段时,它会再次通过验证...而且它要求:密码我没有保存在db中,所以:

User.first.admin = !User.first.admin

甚至不起作用:(

3 个答案:

答案 0 :(得分:6)

这里的问题特别是mongoid,而不是mongodb。 toggle!ActiveRecord::Base的一部分,但幸运的是,复制起来并不难。

def toggle!(field)
  send "#{field}=", !self.send("#{field}?")
  save :validation => false
end

将其添加到模型中(或将其添加到模块中,并将其包含在模型中),您的Mongoid模型将获得与您在AR中习惯相同的功能。它将读取字段的值,反转它,写入它(通过setter,根据toggle!文档),然后保存文档,绕过验证。

答案 1 :(得分:1)

class FooWrapper {

// ...

public:
  void DoAllFoos();

private:
  std::vector<std::unique_ptr<CommonBase> > bases_;   


} 

void FooWrapper::DoAllFoos() 
{
   for(auto& base: bases)
     base->DoFoo();
}

答案 2 :(得分:0)

好的,验证因类型不起作用,代码应为:

save :validate => false  (not :validation)