我正在运行一个使用 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和callback-one,但它确实适用于 update_attributes。
所以,我可以做几件事——我可以从 params 哈希中去掉 group_id 并直接分配它。或者我可以在我的 Workshop 模型上对 update_attributes 进行猴子补丁来为我执行此操作。
我想避免删除 params 哈希,因为这不直观且不自我记录,此外,任何可能调用 @workshop.update_attributes 的人都会遇到相同的错误。Monkey-patching update_attributes 似乎是最安全的,但也是完全错误的。
还有其他建议吗?
谢谢!