减少带有关联的序列化中的N + 1个查询

问题描述 投票:0回答:1

型号:

class Audio < ActiveRecord::Base
  has_many :tests, as: :item
end

class Video < ActiveRecord::Base
  has_many :tests, as: :item
end

class Test < ActiveRecord::Base
  belongs_to :user
  belongs_to :item, polymorphic: true
end

class User < ActiveRecord::Base
  has_many :tests

  def score_for(item)
    return 0 unless tests.where(item: item).any?

    tests.where(item: item).last.score
  end
end

序列化器:

class VideoSerializer < ActiveModel::Serializer
  attributes :id, :name
  attribute(:score) { user.score_for(object) }

  def user
    instance_options[:user]
  end
end

我尝试序列化许多Video对象,但是N + 1即将来临:

options = { each_serializer: VideoSerializer, user: User.last }
videos = ActiveModelSerializers::SerializableResource.new(Video.all, options).serializable_hash

如果我尝试此操作,则返回空数组(看起来像视频未对此用户进行测试):

options = { each_serializer: VideoSerializer, user: User.last }
videos = ActiveModelSerializers::SerializableResource.new(Video.includes(:tests).where(tests: {user: User.last}), options).serializable_hash

我如何组织无N + 1查询问题的序列化。

ruby-on-rails activerecord ruby-on-rails-5 active-model-serializers
1个回答
0
投票

如果您使用的是触发另一个SQL查询的方法(在这种情况下为where,则无法避免N + 1查询)。

© www.soinside.com 2019 - 2024. All rights reserved.