1

我正在运行一个使用 counter_cache 列的 Rails 2.3.14 应用程序,类似于:

Workshop
  belongs_to :group, :counter_cache => true

Group
  has_many :workshops

如果我直接将我的工作室分配给一个组,计数器缓存会更新得很好。

  @workshop.group = Group.first
  @workshop.save # group counter updated

但是,如果我将 group_id 批量分配给车间,在传统的 Rails 控制器样式中,缓存不会更新。我认为这是 2.3.14 中的一个错误。

  def update
    @workshop = Workshop.find(params[:id])

    # params[:workshop] contains a group_id assignment, thus the problem
    if @workshop.update_attributes(params[:workshop])
      flash[:notice] = 'Workshop was successfully updated.'
      # @workshop.group counter NOT updated

它也存在于旧版本中: http ://railsforum.com/viewtopic.php?id=34473

但是,发布者的“解决方案”引入了一个重复计算错误 - 如果您直接分配,您将获得默认的 rails updatercallback-one,但它确实适用于 update_attributes。

所以,我可以做几件事——我可以从 params 哈希中去掉 group_id 并直接分配它。或者我可以在我的 Workshop 模型上对 update_attributes 进行猴子补丁来为我执行此操作。

我想避免删除 params 哈希,因为这不直观且不自我记录,此外,任何可能调用 @workshop.update_attributes 的人都会遇到相同的错误。Monkey-patching update_attributes 似乎是最安全的,但也是完全错误的。

还有其他建议吗?

谢谢!

4

1 回答 1

1

会使用 Group.update_counters(params[:workshop][:group_id], :workshops_count => +1) 或类似的东西吗?

通过Josh Owens找到了一个很好的资源来解决我的问题,这与你的问题相似。此外,Rails api也有一些信息。在我的例子中,使用你的名字,我想将一个研讨会从一个小组转移到另一个小组,并适当地更新计数器。

于 2012-01-30T16:05:44.300 回答