Мне нужно выполнить некоторую атомарную арифметику в Rails, но я нашел единственный способ сделать это для отдельных объектов - через грубый метод класса update_all
, например ::100100
Account.update_all(["debits = debits + ?", amount], :id => id)
В случае ассоциаций коллекции метод класса update_all
должен использоваться в качестве метода ассоциации, поскольку коллекция будет передавать отсутствующие вызовы метода в класс с соответствующей областью действия:
accounts.update_all(["debits = debits + ?", amount])
При работе с коллекциями это намного приятнее и менее повторяется. Однако это не работает для одноэлементных ассоциаций, то есть belongs_to
и has_one
. method_missing
для AssociationProxy
проходит к целевому экземпляру, у которого не будет метода экземпляра update_all
(естественно).
Есть ли более элегантный способ выполнить эту арифметику? Или update_all
настолько хорош, насколько это возможно?