Actualizando un contador en Rails, ¿esto tiene problemas de concurrencia?

Digamos que permito que las personas voten sobre los elementos, y estoy haciendo esto:

bid = Bid.new
..
bid.save!


item.total_bids += 1
item.save!

¿No tendrá esto problemas si varias personas hacen ofertas por un artículo al mismo tiempo?

preguntado el 27 de agosto de 11 a las 22:08

2 Respuestas

Absolutamente puede tener problemas de concurrencia. Rails proporciona increment_counter para manejar esto:

Item.increment_counter( :total_bids, item.id )

Esto ejecuta el SQL en la base de datos:

UPDATE items SET total_bids = total_bids + 1 WHERE id = x

Mira aquí para más detalles: http://api.rubyonrails.org/classes/ActiveRecord/CounterCache.html#method-i-increment_counter

Respondido 28 ago 11, 03:08

¿Qué pasa si quiero establecer el recuento en 10 o disminuir en 2? - Blankman

Luego vea la rutina update_counters más genérica: Item.update_counters item.id,: total_bids => -2 - asc99c

Si está utilizando Sidekiq o tener un .delay método con una cola de trabajos similar intente esto:

Item.delay.increment_counter(:total_bids, item.id)

Respondido 02 Abr '15, 21:04

No es la respuesta que estás buscando? Examinar otras preguntas etiquetadas or haz tu propia pregunta.