1

次のような 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 は最も安全に思えますが、完全に、恐ろしく間違っています。

他の提案はありますか?

ありがとう!

4

1 に答える 1

1

Group.update_counters(params [:workshop] [:group_id]、:workshops_count => +1)または同様の機能を使用しますか?

JoshOwensを介してあなたと同様の私の問題を修正する良いリソースを見つけました。また、RailsAPIにもいくつかの情報があります。私の場合、あなたの名前を使って、ワークショップをあるグループから別のグループに移動し、カウンターを適切に更新してもらいたいと思います。

于 2012-01-30T16:05:44.300 に答える