【问题标题】:Cache Response That Uses Include使用包含的缓存响应
【发布时间】:2011-02-04 16:22:45
【问题描述】:

我已经学习了如何使用 Rails.cache.fetch 函数来缓存数据库调用,但是,当我响应请求时,我会包含几个相关表的内容,例如

tracks = Rails.cache.fetch("events-by-track", :expires_in => 12.hours) do
  Track.find(:all)
end
respond_with(tracks, :include => {:events => {:include => :speaker}})

这会缓存(我认为)调用 Track.find(:all),但它是否也缓存了包含的事件和扬声器?

【问题讨论】:

    标签: ruby-on-rails caching include


    【解决方案1】:

    不,它不会缓存那些。您还必须将它们放在调用中以包含它们。例如,像这样:

    轨道 = Rails.cache.fetch("events-by-track", :expires_in => 12.hours) 做 Track.find(:all, :include => {:events => :speaker}) 结尾 响应(曲目)

    关联对象数组示例:

    轨道,事件 = Rails.cache.fetch("events-by-track", :expires_in => 12.hours) 做 轨道 = Track.find(:all, :include => [:events]) 事件 = track.collect(&:events) 曲目、活动 结尾 响应(曲目)

    【讨论】:

    • 嗨,谢谢,但这给了我一个错误。未找到名为“include”的关联;也许你拼错了?
    • 如果我只是让它 Track.find(:all, :include => [:events]) 它返回所有的轨道,但不包括事件。
    • 我已经更新了我的解决方案。机制不如 Rails.cache.fetch 块中的内容是实际缓存的概念重要。请记住,您实现缓存的方式可能不允许您正确存储这些关联。您可能还需要修改实际存储的内容。例如,您可能需要返回关联对象的数组。
    • 另一个更高效的解决方案可能是缓存您的视图而不是实际的 ActiveRecord 对象。这样,您可以缓存使用此查询后实际显示的内容。
    猜你喜欢
    • 1970-01-01
    • 2017-05-09
    • 2023-03-13
    • 2015-02-21
    • 1970-01-01
    • 2020-03-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多