Ruby on rails 对活动模型序列化程序属性的嵌套查询
我有两个模型,艺术品和事件,一件艺术品有很多事件。 一些事件得到证实 在我的序列化程序中,我想返回每个艺术品的最后确认事件 现在确实如此,但也会产生一个缓慢的n+1?查询每个序列化艺术品从何处获取所有事件 我怎样才能做得更快 artwork_controller.rb def索引 @艺术品=艺术品 render json:@artworks 终止 artwork_serializer.rb 属性:id、:name、:photo、:created\u at 你有一件事吗 object.events.confirm.last 终止 和日志 通过Api::V1::ArtworksControllerindex作为JSON进行处理 乘客负载2.0ms从artworks中选择artworks。* ↳ app/controllers/api/v1/artworks\u controller.rb:11 [active_model_serializers]事件加载1.2ms选择事件。*从事件中,events.artwork_id=$1和events.published=$2 ORDER BY events.created_在DESC LIMIT$3[[artwork_id,16],[published,true],[LIMIT,1]] [活动\u模型\u序列化程序]↳ app/serializers/api/v1/artwork_serializer.rb:9 [active_model_serializers]事件加载0.8ms选择事件。*从事件中,events.artwork_id=$1和events.published=$2 ORDER BY events.created_在DESC LIMIT$3[[artwork_id,9],[published,true],[LIMIT,1]] [活动\u模型\u序列化程序]↳ app/serializers/api/v1/artwork_serializer.rb:9 [active_model_serializers]事件加载2.1ms选择事件。*从事件中,events.artwork_id=$1和events.published=$2 ORDER BY events.created_在DESC LIMIT$3[[artwork_id,27],[published,true],[LIMIT,1]] [活动\u模型\u序列化程序]↳ app/serializers/api/v1/artwork_serializer.rb:9 ... 每件艺术品 [活动\u模型\u序列化程序]↳ app/serializers/api/v1/artwork_serializer.rb:9 [active_model_serializers]用户加载1.7ms选择用户。*从用户中,users.id=$1 LIMIT$2[[id,84],[LIMIT,1]] [活动\u模型\u序列化程序]↳ app/serializers/api/v1/event_serializer.rb:9 [active_model_serializers]缓存事件加载0.0ms选择事件。*从事件中,events.artwork_id=$1和events.published=$2按事件排序。按描述限制$3创建[artwork_id,9],[published,true],[LIMIT,1]] [活动\u模型\u序列化程序]↳ app/serializers/api/v1/artwork_serializer.rb:9 [active_model_serializers]用户加载0.6ms选择用户。*从用户中选择users.id=$1 LIMIT$2[[id,88],[LIMIT,1]] [活动\u模型\u序列化程序]↳ app/serializers/api/v1/event_serializer.rb:9 [active_model_serializers]缓存事件加载0.0ms选择事件。*从事件中,events.artwork_id=$1和events.published=$2按事件排序。按描述限制$3创建[artwork_id,27],[published,true],[LIMIT,1]] [活动\u模型\u序列化程序]↳ app/serializers/api/v1/artwork_serializer.rb:9 [active_model_serializers]用户加载0.5ms选择用户。*从用户中选择users.id=$1 LIMIT$2[[id,76],[LIMIT,1]] [活动\u模型\u序列化程序]↳ app/serializers/api/v1/event_serializer.rb:9 [active_model_serializers]缓存事件加载0.0ms选择事件。*从事件中,events.artwork_id=$1和events.published=$2 ORDER BY events.created_在DESC LIMIT$3[[artwork_id,11],[published,true],[LIMIT,1]] ... 每件艺术品的活动 您可以尝试以下方法: 请将此关联添加到艺术品模型 在您的artworks控制器中添加快速加载Ruby on rails 对活动模型序列化程序属性的嵌套查询,ruby-on-rails,performance,activerecord,active-model-serializers,Ruby On Rails,Performance,Activerecord,Active Model Serializers,我有两个模型,艺术品和事件,一件艺术品有很多事件。 一些事件得到证实 在我的序列化程序中,我想返回每个艺术品的最后确认事件 现在确实如此,但也会产生一个缓慢的n+1?查询每个序列化艺术品从何处获取所有事件 我怎样才能做得更快 artwork_controller.rb def索引 @艺术品=艺术品 render json:@artworks 终止 artwork_serializer.rb 属性:id、:name、:photo、:created\u at 你有一件事吗 object.events
# app/controllers/artwork_controllers.rb
def index
@artworks = Artwork.all.includes(:last_confirmed_event)
render json: @artworks
end
上次使用序列化程序中声明的关联时
# app/serializers/artwork_serializer.rb
attributes :id, :name, :photo, :created_at
has_one :last_confirmed_event
您可以根据自己的选择更改关联名称。您可以尝试以下操作:
请将此关联添加到艺术品模型
在您的artworks控制器中添加快速加载
# app/controllers/artwork_controllers.rb
def index
@artworks = Artwork.all.includes(:last_confirmed_event)
render json: @artworks
end
上次使用序列化程序中声明的关联时
# app/serializers/artwork_serializer.rb
attributes :id, :name, :photo, :created_at
has_one :last_confirmed_event
您可以根据自己的选择更改关联名称。几乎就像它总是返回第一个事件,而不是最后一个事件一样,调整查询是否会使作业有一个:最后一个确认的事件,->{ordercreated\u at::desc.where确认的:true},class\u name:'event'完成得很好@petitkriketAlmost因为它总是返回第一个事件,而不是最后一个事件,所以调整查询不会导致此作业有一个:最后一个确认的事件,->{ordercreated_at::desc.whereconfirm:true},类名称:'event'做得很好@小克里克特