轨道关键memcached的达利编组错误(rails memcached dalli Marshal

2019-10-17 12:44发布

我在我的控制器,这样的行动:

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

Answer 1:

缓存取出码是完全错误的。 获取此参数是标识要数据的字符串。 你的代码试图使用相同字符串,为每一位用户,让他们都看到,会通过此方法的第一次调用保存相同的帖子。

在我下面的例子我使用的用户ID和一个字符串“帖子”,以指示特定用户的所有帖子。

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

最后,ActiveRecord的延迟使得实际的数据库调用,直到绝对必要的。 在查询的结尾。所有调用将返回的数据,该数据是你想要缓存的,而不是用来创建一个查询的配置数据。

下面是正确的代码:

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


Answer 2:

它很可能抱怨这一点:

class User < ::User

有没有你为什么不使用任何的理由:

class User < ActiveRecord::Base



文章来源: rails memcached dalli Marshalling error for key