Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 对活动模型序列化程序属性的嵌套查询_Ruby On Rails_Performance_Activerecord_Active Model Serializers - Fatal编程技术网

Ruby on rails 对活动模型序列化程序属性的嵌套查询

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

我有两个模型,艺术品和事件,一件艺术品有很多事件。 一些事件得到证实

在我的序列化程序中,我想返回每个艺术品的最后确认事件

现在确实如此,但也会产生一个缓慢的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控制器中添加快速加载

# 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'做得很好@小克里克特