【发布时间】:2019-11-25 13:32:39
【问题描述】:
型号:
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 查询问题的情况下组织序列化。
【问题讨论】:
-
我很困惑。为什么要在用户中硬编码最后一个 sn-p?如果没有针对该用户的测试,这似乎按预期工作。如果您刚刚拥有
Video.include(:tests),那将急切进行负载测试。如果您还想急切加载用户,可以尝试Video.includes(tests: :user) -
不太清楚你的意思,但无论如何我想要为这个用户独家序列化视频。
标签: ruby-on-rails activerecord ruby-on-rails-5 active-model-serializers