rails memcached dalli密钥的编组错误

时间:2012-12-25 11:02:07

标签: ruby-on-rails memcached rails-engines dalli

我在我的控制器中有这样的动作:

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

2 个答案:

答案 0 :(得分:2)

缓存获取代码都是错误的。 fetch 的参数是一个标识所需数据的字符串。您的代码尝试为每个用户使用相同的字符串,因此他们都会看到第一次调用此方法时保存的相同帖子。

在下面的示例中,我使用了用户ID和字符串&#39;帖子&#39;表示特定用户的所有发布。

在获取块中分配 @postings 是不正确的,块的结果(查询结果)保存到 @postings

最后,ActiveRecord延迟进行实际的数据库调用,直到绝对必要。查询结尾处的 .all 调用将返回数据,数据是您要缓存的数据,而不是用于创建查询的配置数据。

这是正确的代码:

@postings = Rails.cache.fetch("#{@user.id}:postings") do
    @user.postings.includes(:category).all
end

答案 1 :(得分:0)

可能会抱怨这个:

class User < ::User

你有没有理由不使用:

class User < ActiveRecord::Base