3

関連に対して counter_cache が有効になっているモデルがあります。

class Post
  belongs_to :author, :counter_cache => true
end

class Author
  has_many :posts
end

@author.posts_countまた、「作成者」ごとにキャッシュフラグメントを使用しており、その値が UI に表示されているため、更新されるたびにそのキャッシュを期限切れにしたいと考えています。問題は、(increment_counter と decrement_counter) の内部がcounter_cacheAuthor のコールバックを呼び出していないように見えるため、Post オブザーバー (またはキャッシュ スイーパー) 内からキャッシュを期限切れにする以外に、それがいつ発生したかを知る方法がないことです。きれいに見えません。

何か案は?

4

5 に答える 5

0

私もそれを機能させることができませんでした。結局、私はあきらめて、独自の cache_counter のようなメソッドを作成し、after_saveコールバックから呼び出しました。

于 2011-06-13T08:16:38.197 に答える
0

最終的には cache_counter をそのままにしておきましたが、次のように Post の after_create コールバックを介して強制的にキャッシュを期限切れにしました。

class Post
  belongs_to :author, :counter_cache => true
  after_create :force_author_cache_expiry

  def force_author_cache_expiry
    author.force_cache_expiry!
  end
end

class Author
  has_many :posts

  def force_cache_expiry!
    notify :force_expire_cache
  end
end

thenforce_expire_cache(author)は、キャッシュ フラグメントを期限切れにする AuthorSweeper クラスのメソッドです。

于 2011-06-14T18:48:49.467 に答える
0

まあ、私は同じ問題を抱えていて、あなたの投稿に行き着きましたが、「after_」および「before_」コールバックはパブリックメソッドであるため、次のことができることを発見しました:

class Author < ActiveRecord::Base
  has_many :posts

  Post.after_create do
    # Do whatever you want, but...
    self.class == Post # Beware of this
  end
end

これを行うための標準がどの程度かはわかりませんが、メソッドは公開されているので、問題ないと思います。

キャッシュとモデルを分離したい場合は、Sweepersを使用できます。

于 2012-03-05T08:28:00.240 に答える