在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中执行此操作?
答案 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
,它提供了在同一事务中运行任意函数的机制。这允许你做像计数器缓存或任何你喜欢的东西。
它也是在生成变更集的同时计算的,因此您无需在代码库中的任意位置“专门”更新计数器。