开发者

Simple boolean data update with mongdb?

I am using Rails and mongoid to work with mongodb.

Usually in rails when working with Active:Record, you have access to the method .toggle! which simply allows you to invert the value of a boolean field in your db.

Unfortunately this method is not available for mongoDB:

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

This is unfortunate... and stupidly enough I don't see how to get around without some complicated code...

Any suggestion on how to achieve the same result concisely ?

Thanks,

Alex

ps: also one of the problems is that when I wa开发者_JAVA技巧nt to modify the field, it goes through validation again... and it's asking for the :password which I don't save in the db, so:

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

won't even work :(


The issue here is specifically mongoid, not mongodb. toggle! is a part of ActiveRecord::Base, but fortunately it's not hard to replicate.

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

Add that into your model (or add it into a module, and include it in your model), and your Mongoid models will gain functionality equivalent to what you're used to in AR. It will read the field's value, invert it, write it (through the setter, per the toggle! documentation), and then save the document, bypassing validation.


# Get object's boolean field and toggle it
# @param [Object] mongoid object 
# @param [String, Symbol] flag
# @example 
#  foo = User.find('123')
#  toggle_flag!(object: foo, flag: :bar)

def toggle_flag!(object:, flag:)
  object.update(flag => !object[flag])
  object.save!
end


Ok the validation did not work because of a type, the code should be:

save :validate => false  (not :validation)
0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜