Rails用update_attributes更新counter_cache'd关联; counter_cache列未更新

时间:2011-12-28 23:36:03

标签: ruby-on-rails update-attributes counter-cache

我正在运行一个使用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 updater 回调一,但它做< / em>为update_attributes工作。

所以,我可以做几件事 - 我可以从params哈希中删除group_id并直接分配它。或者我可以在我的Workshop模型上修补update_attributes来为我做这个。

我想避免删除params哈希,因为这不是直观的和自我记录的,而且任何可能调用@ workshop.update_attributes的人都会遇到同样的错误。猴子修补update_attributes似乎最安全,但也完全,非常错误。

还有其他建议吗?

谢谢!

1 个答案:

答案 0 :(得分:1)

会使用Group.update_counters(params [:workshop] [:group_id],:workshops_count =&gt; +1)或类似的工作吗?

通过Josh Owens找到了一个很好的资源来解决我的问题。此外,Rails api也有一些信息。在我的情况下,使用你的名字,我想把一个研讨会从一个小组移到另一个小组,并让计数器适当更新。