我在我的控制器中有这样的动作:
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
答案 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