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”来指示特定用户的所有帖子。

在 fetch 块内分配@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 回答