如何自定义 jsonapi-serializer 缓存命名空间 - Ruby on Rails
How to customize jsonapi-serializer caching namespace - Ruby on Rails
在我的 rails 应用程序中,我有 categories
是根据 location
分类的。我想使用 jsonapi-serializer
的缓存方法 cache_options store: Rails.cache, namespace: 'jsonapi-serializer', expires_in: 3.hours
在序列化程序级别缓存这些类别。这里的问题是,当我第一次调用它来检索 City A
中的类别然后稍后尝试从 City B
中检索类别时,它仍然会显示 City A
的数据。我现在要做的是将 city
传递给序列化程序,然后使用类似 namespace: "jsonapi-serializer/categories/#{:city}"
的方式将其添加到 namespace
以区分它们,但我无法找到一种方法。
目前我有这段代码可以根据位置检索 categories
然后序列化并呈现 json
category = Category.active_categories(headers['User-Location'])
unless category.empty?
generic_category = Category.all_category
categories = generic_category, category
render CategorySerializer.new(categories.flatten, { params: { user_location: headers['User-Location'] } })
end
虽然 Category.active_categories
和 Category.all_category
正在缓存如下查询:
active_categories:
def self.active_categories(user_location)
Rails.cache.fetch("active_categories/#{user_location}", expires_in: 3.hours) do
Category.where(status: 'active')
.joins(:sellers).where(sellers: { status: 'active', is_validated: true })
.joins(sellers: :cities).where(cities: { name_en: user_location })
.joins(sellers: :products).where(products: { status: 'available' })
.where.not(products: { quantity: 0 }).with_attached_cover
.order(featured: :desc).uniq.to_a
end
end
all_category:
def self.all_category
Rails.cache.fetch('all_category', expires_in: 24.hours) do
Category.where(name_en: 'All').with_attached_cover.first
end
end
已经找到解决方案。只需重写缓存方法,如下例所示:
require 'active_support/cache'
class MySerializer
include JSONAPI::Serializer
cache_options(store: Rails.cache, namespace: 'jsonapi-serializer', expires_in: 3.hours)
def self.record_cache_options(options, fieldset, include_list, params)
return super(options, fieldset, include_list, params) if params[:user_location].blank?
opts = options.dup
opts[:namespace] += ':' + params[:user_location]
opts
end
end
在我的 rails 应用程序中,我有 categories
是根据 location
分类的。我想使用 jsonapi-serializer
的缓存方法 cache_options store: Rails.cache, namespace: 'jsonapi-serializer', expires_in: 3.hours
在序列化程序级别缓存这些类别。这里的问题是,当我第一次调用它来检索 City A
中的类别然后稍后尝试从 City B
中检索类别时,它仍然会显示 City A
的数据。我现在要做的是将 city
传递给序列化程序,然后使用类似 namespace: "jsonapi-serializer/categories/#{:city}"
的方式将其添加到 namespace
以区分它们,但我无法找到一种方法。
目前我有这段代码可以根据位置检索 categories
然后序列化并呈现 json
category = Category.active_categories(headers['User-Location'])
unless category.empty?
generic_category = Category.all_category
categories = generic_category, category
render CategorySerializer.new(categories.flatten, { params: { user_location: headers['User-Location'] } })
end
虽然 Category.active_categories
和 Category.all_category
正在缓存如下查询:
active_categories:
def self.active_categories(user_location)
Rails.cache.fetch("active_categories/#{user_location}", expires_in: 3.hours) do
Category.where(status: 'active')
.joins(:sellers).where(sellers: { status: 'active', is_validated: true })
.joins(sellers: :cities).where(cities: { name_en: user_location })
.joins(sellers: :products).where(products: { status: 'available' })
.where.not(products: { quantity: 0 }).with_attached_cover
.order(featured: :desc).uniq.to_a
end
end
all_category:
def self.all_category
Rails.cache.fetch('all_category', expires_in: 24.hours) do
Category.where(name_en: 'All').with_attached_cover.first
end
end
已经找到解决方案。只需重写缓存方法,如下例所示:
require 'active_support/cache'
class MySerializer
include JSONAPI::Serializer
cache_options(store: Rails.cache, namespace: 'jsonapi-serializer', expires_in: 3.hours)
def self.record_cache_options(options, fieldset, include_list, params)
return super(options, fieldset, include_list, params) if params[:user_location].blank?
opts = options.dup
opts[:namespace] += ':' + params[:user_location]
opts
end
end