Как обновить накопительное поле в базе данных Rails (используя ActiveRecord или Mongoid)? - PullRequest
1 голос
/ 30 декабря 2010

Я хочу обновить поле в таблице базы данных, которое должно иметь накопительное значение.Поэтому в основном мне нужно найти текущее значение поля и обновить его, используя новый номер.

Моя первая неэффективная попытка (в Mongoid):

v = Landlord.where(:name=>"Lorem")
v.update_attributes(:violations=>v.violations + 10)

Есть ли простой способ, чем сделать один запрос для чтения, затем суммировать и другой запрос для записи?1006 *

1 Ответ

1 голос
/ 30 декабря 2010

MongoDB предоставляет специальную поддержку операций атомарного обновления именно для этого сценария - взгляните на модификатор $inc в Документация обновления .Ваш пример в простой консоли mongo будет:

db.landlords.update( { name:"Lorem" }, { $inc: { violations : 10 } } );

Для Mongoid это будет:

Landlord.where(:name => "Lorem").first.inc(:violations, 10)

Это установит нарушения равными 10, если поле определено в вашей моделино в противном случае он еще не был инициализирован для какого-либо значения.

Но на самом деле, он по-прежнему выполняет два запроса (найдите арендодателя, а затем обновите его).Чтобы сделать все это в одном, вам нужно пройти через объект Mongoid::Collection, который передает большинство вызовов напрямую через драйвер Mongo Ruby.Это выглядело бы так:

Landlord.collection.update({ :name => "Lorem" }, '$inc' => { :violations => 10 })

Это помогает ознакомиться с драйвером Ruby для таких случаев, когда вы хотите получить более прямой контроль.Его API пытается соответствовать синтаксису оболочки mongo Javascript.

...