当前位置:  开发笔记 > 前端 > 正文

操纵ActiveRecord对象以构建JSON

如何解决《操纵ActiveRecord对象以构建JSON》经验,为你挑选了0个好方法。

我们正在尝试加快网页加载速度.主要问题是该页面上的一些activerecord生成的查询.

如果你看一下他们生成的SQL(Postgres),查询如下(所有代码都有点简化):

select * from feed_details where account_id = 5
select * from feeds where id in (VERY_LONG_LIST_OF_IDS_FROM_FIRST_QUERY)
select * from feeds_metadata where feed_id in (VERY_LONG_LIST_FROM_FIRST_QUERY)
select * from documents where feed_id in (VERY_LONG_LIST_FROM_FIRST_QUERY)

所有索引都已到位,但我们通过将其更改为以下内容来验证他们只花了不到一半的时间:

select * from feeds, feed_details where id = feed_id and account_id = 5
select * from feeds_metadata fm, feed_details fd where fm.feed_id = fd.feed_id and account_id = 5
select * from documents where d, feed_details fd where d.feed_id = fd.feed_id and account_id = 5

到目前为止,这么简单.以下是Rails问题:这些查询是由FeedDetail模型中的此代码生成的:

class FeedDetail < ActiveRecord::Base

  has_many :feeds
  has_many :feeds_metadata
  has_many :documents

  scope :feeds_data_for_account, ->(current_account_id) do
    FeedDetail
              .includes(:feeds, :feeds_metadata, :documents)
              .where(
                  account_id: current_account_id
              )
  end

这将生成一个活动记录对象(包含来自上述查询的数据),在控制器中用于构建发送到网页的JSON,如下所示(请参阅feeds_data行):

  def index
    consumer          = ConsumerWithAccount.new(current_user.account)
    feed_builder      = FeedBuilder
    feeds_data        = FeedDetail.feeds_data_for_account(current_user.account.id)

    render json: ResponseBuilder.new(consumer, feed_builder, feeds_data)
  end

为了使用更快的查询,我们希望通过使用更快的查询来构建传递给JSON构建器的feeds_data activerecord对象.这将涉及摆脱"涉及",其中(貌似)在SQL中使用IN().

如果有用,我们对activerecord中的每个3个数据源都有正确的查询,它们看起来像:

Feed.joins(:feed_details).where(feed_document_sets: {account_id: current_account_id})

但是我们无法弄清楚如何构建那个活跃的记录对象:其中存在着众所周知的问题.

计划B是重写响应构建器以采用不同类型的对象,但这看起来更复杂.

写这篇文章的人已经不在公司了.

任何建议将不胜感激.

推荐阅读
拾味湖
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有