在Ecto / Phoenix实施更新计数器的最佳方法是什么?

时间:2017-07-10 11:17:20

标签: ruby-on-rails elixir phoenix-framework ecto

在ruby on rails(活动记录)中,我们可以通过调用来更新计数器      # 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 方法。例如在rails中你只需要写:

{{1}}

考虑到我必须更新多列的计数器,有没有简单的方法在elixir / phoenix中执行此操作?

2 个答案:

答案 0 :(得分:4)

Alternativaly你可以使用inc选项:

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

答案 1 :(得分:4)

我差不多一年前写过这篇文章,但它仍然具有相关性,作为奖励,它是从“来自Rails”的角度编写的。

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

您最好的选择是使用prepare_changes/2,它提供了在同一事务中运行任意函数的机制。这允许你做像计数器缓存或任何你喜欢的东西。

它也是在生成变更集的同时计算的,因此您无需在代码库中的任意位置“专门”更新计数器。