2013-02-18 4 views
1

Я хочу, чтобы там всегда быть по крайней мере, один документ в базе данных, которая имеет поле под названием «selected» установлен верно. Как мне это сделать? Скорее всего, мне приходится использовать обратные вызовы, но какой: before (or after) _create, _upsert, _update?Mongoid - установить поле, правда, по крайней мере, один документ

И как я могу гарантировать, что он будет установлен в true, независимо от выполняемой операции: create, update, upsert ...? Я думаю, что было бы неправильно создавать обратный вызов для каждого из них.

ответ

2

after_save always runs после создания & обновления

так что вы можете сделать:

after_save do |your_class| 
    your_class.update_column(:selected, true) unless YourClass.where(selected: true).exists? 
end 

NB./ update_column should not fire the after_save again!

+0

не будет бесконечной рекурсии? –

+0

Хорошая точка. Есть ссылка на этот NB./ http://stackoverflow.com/questions/632742/how-can-i-avoid-running-activerecord-callbacks/7386222#7386222 – gef

+0

не будет бесконечной рекурсии? –