rails 5 API低级缓存

我对Rails API缓存有点困惑。 我正在使用JSONAPI规范和fast_jsonapi gem并尝试在show动作上缓存车辆本身,如果有像para include=service_notes,service_alerts这样的params include=service_notes,service_alerts那么我也想缓存它们。 这是我最初的方法,但不确定它是否正确。

我有两个主要问题:

  1. 对于车辆缓存本身有一个比我的车辆更好的方法= Vehicle.find_cached(params [:id])。 如果车辆已更新,则不使用updated_at,而是使用after save回调来更新缓存。 我只是不知道我是否能以某种方式使用像Rails.cache.fetch(["vehicles", vehicle], version: vehicle.updated_at)因为它在这里建议: https : //github.com/rails/rails / pull / 29092因为这需要车辆实例。 如您所见, set_vehicle控制器方法非常尴尬。

  2. 这个Rails.cache.fetch(['vehicles', vehicle, include_params], version: vehicle.updated_at)是否有意义? 我试图根据不同的包括参数缓存查询。 也许它有点矫枉过正,我可以只包括所有内容并将其缓存为:

    Rails.cache.fetch([‘vehicles’,vehicle,’with_includes’],version:vehicle.updated_at)执行Vehicle.includes(:vehicle_alerts,:service_notes,:service_intervals).find(params [:id])end

在这里处理缓存的正确方法是什么?

service_note.rbservice_interval.rbvehicle_alert.rb设置相同

 class ServiceNote < ApplicationRecord belongs_to :vehicle, touch: true end 

vehicle.rb

 class Vehicle < ApplicationRecord after_save :update_cache has_many :vehicle_alerts, dependent: :delete_all has_many :service_notes, dependent: :delete_all has_many :service_intervals, dependent: :delete_all def update_cache Rails.cache.write(['vehicles', vehicle_id], self) end def self.find_cached(vehicle_id) Rails.cache.fetch(['vehicles', vehicle_id]) { find(vehicle_id) } end end 

vehicles_controller.rb

 before_action :set_vehicle, only: [:show] def show render json: VehicleSerializer.new(@vehicle, options).serialized_json end private def set_vehicle vehicle = Vehicle.find_cached(params[:id]) @vehicle = Rails.cache.fetch(['vehicles', vehicle, include_params], version: vehicle.updated_at) do Vehicle.includes(include_params).find(params[:id]) end authorize @vehicle end 

vehicle_serializer.rb(带有fast_jsonapi gem)

 # same for :service_notes and :vehicle_alerts has_many :service_intervals do |vehicle, params| if params[:include] && params[:include].include?(:service_intervals) vehicle.service_intervals end end