/ / ¿Cuál es la mejor manera de implementar el contador de actualizaciones en Ecto / Phoenix? - ruby-on-rails, elixir, phoenix-framework, ecto

¿Cuál es la mejor manera de implementar el contador de actualizaciones en Ecto / Phoenix? - Rubí sobre rieles, elixir, phoenix-framework, ecto

En ruby ​​on rails (registro activo) podemos actualizar el contador simplemente llamando update_counter método. por ejemplo en rieles solo necesitas escribir:

  # For the Post with id of 5, decrement the comment_count by 1, and
# increment the action_count by 1
Post.update_counters 5, :comment_count => -1, :action_count => 1
# Executes the following SQL:
# UPDATE posts
#    SET comment_count = comment_count - 1,
#        action_count = action_count + 1
#  WHERE id = 5

¿Hay alguna manera fácil de hacer esto en elixir / phoenix teniendo en cuenta que tengo que actualizar el contador de varias columnas?

Respuestas

4 para la respuesta № 1

Alternativamente, puede ir con algo como esto usando el inc opción:

Post
|> where(id: 5)
|> Repo.update_all(inc: [comment_count: -1, action_count: 1])

4 para la respuesta № 2

Escribí este artículo hace casi un año, pero aún es relevante, y como beneficio adicional, está escrito desde la perspectiva de "venir de Rails".

https://medium.com/@lukerollans_17079/counter-caching-in-phoenix-8ac372e5c0c5

Tu mejor apuesta es usar prepare_changes/2 que proporciona un mecanismo para ejecutar una función arbitraria en la misma transacción. Esto le permite hacer cosas como el almacenamiento en caché de contador, o lo que quiera.

También se calcula al mismo tiempo que genera su conjunto de cambios, por lo que no necesita actualizar "especialmente" los contadores en un punto arbitrario en su base de código.