如果我们在控制台上这样做:
> Product.all == Product.all.to_a
true
但是,如果我们这样做:
> Product.all.to_a.where(name: "something")
!! #<NoMethodError: undefined method `where' for #<Array:0x000055b42c6a3f20>>
如果我们不运行'to_a'这个方法,那不是问题。
问题在于,在此{{3}}上,他们展示了这种使用缓存的方法:
def self.all_cached
Rails.cache.fetch('Contact.all') { all.to_a }
end
并且从此方法返回的查询结果不能使用active_record,因为它会得到与我之前解释的相同的错误。
我的主要目标是使用缓存,并知道是否有可能通过将active_record确认作为可行的查询来解决此问题,并将其排列成阵列。
答案 0 :(得分:0)
我通过以下更改解决了对缓存的查询结果使用activerecord的问题:
来自:
def self.all_cached
Rails.cache.fetch('Contact.all') { all.to_a }
end
收件人:
def self.all_cached
Rails.cache.fetch("all_contacts") do
Contact.all
end
end
现在它不是数组变量。
heroku article告知最佳方法是将其转换为数组后,此问题才能得到部分解决:
请注意,我们缓存all.to_a而不是全部。这是因为 Rails 4 Model.all延迟执行,您需要转换 使用to_a将contact.all放入一个数组中以缓存实际的 联系人。