我正在运行一个使用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似乎最安全,但也完全,非常错误。
还有其他建议吗?
谢谢!
答案 0 :(得分:1)
会使用Group.update_counters(params [:workshop] [:group_id],:workshops_count =&gt; +1)或类似的工作吗?
通过Josh Owens找到了一个很好的资源来解决我的问题。此外,Rails api也有一些信息。在我的情况下,使用你的名字,我想把一个研讨会从一个小组移到另一个小组,并让计数器适当更新。