首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >计算字段的主动模型序列化程序缓存

计算字段的主动模型序列化程序缓存
EN

Stack Overflow用户
提问于 2016-08-05 00:24:22
回答 1查看 646关注 0票数 0

我正在尝试缓存一个项目集合,这是我的AMS:

代码语言:javascript
复制
class ApplicationCategorySerializer < ActiveModel::Serializer

  cache({})
  cache key: 'application_category', expires_in: 3.days

  attributes :id
  attributes :name
  attributes :active
  attributes :group
  attributes :num_of_protocols

  belongs_to :group do |serializer|
    serializer.attributes[:group][:name]
  end


  def num_of_protocols
    ApplicationCategory.find(object.id).protocol_categories.count
  end
end

我的问题是,如果没有:num_of_protocols部分,生成响应需要10倍的速度,

当我查看日志时,我可以看到:

代码语言:javascript
复制
Started GET "/application_categories.json" for 127.0.0.1 at 2016-08-04 19:12:27 +0300
Processing by ApplicationCategoriesController#index as JSON
  ApplicationCategory Load (3.0ms)  SELECT "application_categories".* FROM "application_categories"
[active_model_serializers]   Group Load (1.0ms)  SELECT  "groups".* FROM "groups" WHERE "groups"."id" = ? LIMIT 1  [["id", 2066]]
[active_model_serializers]   ApplicationCategory Load (0.0ms)  SELECT  "application_categories".* FROM "application_categories" WHERE "application_categories"."id" = ? LIMIT 1  [["id", 1]]
[active_model_serializers]    (0.0ms)  SELECT COUNT(*) FROM "protocol_categories" INNER JOIN "application_categories_protocol_categories" ON "protocol_categories"."id" = "application_categories_protocol_categories"."protocol_category_id" WHERE "application_categories_protocol_categories"."application_category_id" = ?  [["application_category_id", 1]]
[active_model_serializers]   CACHE (0.0ms)  SELECT  "groups".* FROM "groups" WHERE "groups"."id" = ? LIMIT 1  [["id", 2066]]
[active_model_serializers]   ApplicationCategory Load (0.0ms)  SELECT  "application_categories".* FROM "application_categories" WHERE "application_categories"."id" = ? LIMIT 1  [["id", 2]]
[active_model_serializers]    (0.0ms)  SELECT COUNT(*) FROM "protocol_categories" INNER JOIN "application_categories_protocol_categories" ON "protocol_categories"."id" = "application_categories_protocol_categories"."protocol_category_id" WHERE "application_categories_protocol_categories"."application_category_id" = ?  [["application_category_id", 2]]
[active_model_serializers]   CACHE (0.0ms)  SELECT  "groups".* FROM "groups" WHERE "groups"."id" = ? LIMIT 1  [["id", 2066]]
...................... [many many more lines like those...]
[active_model_serializers]   CACHE (0.0ms)  SELECT  "application_categories".* FROM "application_categories" WHERE "application_categories"."id" = ? LIMIT 1  [["id", 608]]
[active_model_serializers]   CACHE (0.0ms)  SELECT COUNT(*) FROM "protocol_categories" INNER JOIN "application_categories_protocol_categories" ON "protocol_categories"."id" = "application_categories_protocol_categories"."protocol_category_id" WHERE "application_categories_protocol_categories"."application_category_id" = ?  [["application_category_id", 608]]
[active_model_serializers]   CACHE (0.0ms)  SELECT  "application_categories".* FROM "application_categories" WHERE "application_categories"."id" = ? LIMIT 1  [["id", 609]]
[active_model_serializers]   CACHE (0.0ms)  SELECT COUNT(*) FROM "protocol_categories" INNER JOIN "application_categories_protocol_categories" ON "protocol_categories"."id" = "application_categories_protocol_categories"."protocol_category_id" WHERE "application_categories_protocol_categories"."application_category_id" = ?  [["application_category_id", 609]]
[active_model_serializers]   CACHE (0.0ms)  SELECT  "application_categories".* FROM "application_categories" WHERE "application_categories"."id" = ? LIMIT 1  [["id", 610]]
[active_model_serializers]   CACHE (0.0ms)  SELECT COUNT(*) FROM "protocol_categories" INNER JOIN "application_categories_protocol_categories" ON "protocol_categories"."id" = "application_categories_protocol_categories"."protocol_category_id" WHERE "application_categories_protocol_categories"."application_category_id" = ?  [["application_category_id", 610]]
[active_model_serializers] Rendered ActiveModel::Serializer::CollectionSerializer with ActiveModelSerializers::Adapter::Attributes (1521.15ms)

如何使用缓存获得更好的结果?-当我注释掉cache行时,我得到了aprox。与使用它们时相同的时间,当我删除:num_of_protocols时,我在&没有缓存的情况下获得相同的时间。

我的配置有什么错误?

EN

回答 1

Stack Overflow用户

发布于 2016-08-05 01:57:23

你能做到吗?

代码语言:javascript
复制
def num_of_protocols
  object.protocol_categories.count
end

而且,序列化程序对我来说已经有一段时间了,但我认为你可以做到这一点…

代码语言:javascript
复制
def num_of_protocols
  protocol_categories.count
end

这是更好的ruby (在这种情况下,protocal_categories已经作为数组加载)

代码语言:javascript
复制
def num_of_protocols
  protocol_categories.size
end

而且,如果所有这些都有效或无效,请确保在呈现到json之前实例化@application_category时包含protocol_categories和groups。您执行的查询太多。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/38772706

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档