1

私のコントローラーにはそのようなアクションがあります:

def my
  @user = Ads::User.find current_user.id
  @postings = Rails.cache.fetch("@user.postings.includes(:category)") do
    @postings = @user.postings.includes(:category)
  end
end

@postingsをキャッシュしようとすると、そのようなエラーが発生します。

Marshalling error for key '@user.postings.includes(:category)': can't dump anonymous class #<Module:0x000000048f9040>
You are trying to cache a Ruby object which cannot be serialized to memcached.

インクルードなしで@postingsをキャッシュしようとしても、エラーは発生しません。何が問題なのかわからない。

下部に関連するモデルがあります。

module Ads
  class User < ::User
    has_many :postings, dependent: :destroy
  end
end

module Ads
  class Posting < ActiveRecord::Base
    belongs_to :user, counter_cache: true
    belongs_to :category
  end
end

module Ads
  class Category < ActiveRecord::Base
    has_many :postings, dependent: :destroy
  end
end
4

2 に答える 2

3

キャッシュフェッチコードはすべて間違っています。フェッチするパラメータは、必要なデータを識別する文字列です。コードはすべてのユーザーに同じ文字列を使用しようとしているため、このメソッドの最初の呼び出しで保存されるのと同じ投稿がすべてのユーザーに表示されます。

以下の例では、ユーザーIDと文字列'postings'を使用して、特定のユーザーのすべての投稿を示しています。

フェッチブロック内に@postingsを割り当てるのは正しくありません。ブロックの結果(クエリ結果)は@postingsに保存されます

最後に、ActiveRecordは、絶対に必要になるまで実際のデータベース呼び出しを遅らせます。クエリの最後にある.all呼び出しはデータを返します。データは、クエリの作成に使用された構成データではなく、キャッシュしたいものです。

正しいコードは次のとおりです。

@postings = Rails.cache.fetch("#{@user.id}:postings") do
    @user.postings.includes(:category).all
end
于 2012-12-25T17:59:29.060 に答える
0

これについて不平を言っている可能性があります:

class User < ::User

使用していない理由はありますか?

class User < ActiveRecord::Base

于 2012-12-25T16:22:33.063 に答える