【问题标题】:What is the best way to implement update counter in Ecto/Phoenix?在 Ecto/Phoenix 中实现更新计数器的最佳方法是什么?
【发布时间】:2017-07-10 11:17:20
【问题描述】:

在 ruby​​ on rails(active record) 中,我们可以通过调用来更新计数器 update_counter 方法。例如在 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

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

【问题讨论】:

  • 请随时更新或提出任何改进问题的建议。谢谢
  • 请谨慎选择标签。 phoenix与本题无关。
  • 当然@mudasobwa。感谢您的建议。
  • 虽然没有必要删除phoenix-framework :)

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


【解决方案1】:

或者,您可以使用 inc 选项进行类似的操作:

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

【讨论】:

    【解决方案2】:

    我大约一年前写了这篇文章,但它仍然具有相关性,而且作为奖励,它是从“来自 Rails”的角度写的。

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

    最好的办法是使用prepare_changes/2,它提供了一种在同一事务中运行任意函数的机制。这允许您执行计数器缓存之类的操作,或任何您喜欢的操作。

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-21
      • 2012-01-08
      • 1970-01-01
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      相关资源
      最近更新 更多