2011-12-28 103 views
1

我運行一個Rails 2.3.14應用程序,使用counter_cache列counter_cache列,類似於:正在使用update_attributes更新Rails counter_cache的關聯;不更新

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中的一個bug。

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

然而,海報的「解決方案」引入了重複計算的錯誤 - 如果你直接分配,你將得到默認的軌道更新回調一,但它確實工作update_attributes。

所以,我可以做一些事情 - 我可以從參數散列中去掉group_id並直接賦值。或者我可以在我的Workshop模型上修補update_attributes來爲我做這件事。

我想避免去掉params散列,因爲這不是直觀且自我記錄,所以任何其他可能會打電話給@ workshop.update_attributes的人都會遇到同樣的錯誤。猴子補丁update_attributes似乎是最安全的,但也是完全錯誤的。

任何其他建議?

謝謝!

回答

1

會使用Group.update_counters(params [:workshop] [:group_id],:workshops_count => +1)或類似的工作嗎?

找到一個很好的資源,通過Josh Owens解決了我的問題,類似於你的問題。另外,Rails api也有一些信息。在我的情況下,使用你的名字,我想把一個研討會從一個小組移到另一個小組,並且讓這些計數器適當地更新。