Простое булево обновление данных с помощью mongdb? - PullRequest
6 голосов
/ 16 января 2011

Я использую Rails и mongoid для работы с mongodb.

Обычно в rails при работе с Active: Record у вас есть доступ к методу .toggle!который просто позволяет вам инвертировать значение логического поля в вашей базе данных.

К сожалению, этот метод недоступен для mongoDB:

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

Это неудачно ... и достаточно глупоне видите, как обойтись без какого-то сложного кода ...

Любое предложение о том, как добиться того же результата кратко?

Спасибо,

Алекс

ps: также одна из проблем заключается в том, что когда я хочу изменить поле, оно снова проходит проверку ... и запрашивает: пароль, который я не сохраняю в БД, поэтому:

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

даже не сработает: (

Ответы [ 3 ]

6 голосов
/ 16 января 2011

Проблема здесь конкретно в mongoid, а не в mongodb. toggle! является частью ActiveRecord :: Base , но, к счастью, его нетрудно скопировать.

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

Добавьте это в свою модель (или добавьте в модуль и включите в свою модель), и ваши модели Mongoid получат функциональность, эквивалентную той, к которой вы привыкли в AR. Он будет читать значение поля, инвертировать его, записывать его (через установщик, согласно документации toggle!), а затем сохранять документ, минуя проверку.

1 голос
/ 19 марта 2016
# 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
0 голосов
/ 17 января 2011

Хорошо, проверка не работает из-за типа, код должен быть:

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