次のような 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 アップデーターとコールバック 1が取得されますが、update_attributes では機能します。
そのため、いくつかのことを実行できます。params ハッシュから group_id を取り除き、直接割り当てることができます。または、Workshop モデルの update_attributes にモンキー パッチを適用して、これを行うこともできます。
@workshop.update_attributes を呼び出す可能性のある他の人が同じバグに遭遇する可能性があるため、params ハッシュを取り除くことは避けたいと思います。モンキー パッチの update_attributes は最も安全に思えますが、完全に、恐ろしく間違っています。
他の提案はありますか?
ありがとう!