Ruby on rails 为序列化程序预加载/包含多态关联

Ruby on rails 为序列化程序预加载/包含多态关联,ruby-on-rails,active-model-serializers,Ruby On Rails,Active Model Serializers,所有者可以是团队或用户或组。它们中的每一个都具有在 问题是: 我们确实使用ActiveModel::Serializer作为我们的响应。(CommentSerializer)。在我们定义的序列化程序中,属于:owner,并且有很多:children class Comment belongs_to :owner belongs_to :parent # parent/children from the gem awesome_nested_set has_many :children

所有者可以是
团队
用户
。它们中的每一个都具有在

问题是: 我们确实使用
ActiveModel::Serializer
作为我们的响应。(
CommentSerializer
)。在我们定义的序列化程序中,
属于:owner
,并且
有很多:children

class Comment
  belongs_to :owner
  belongs_to :parent # parent/children from the gem awesome_nested_set
  has_many :children # 
end

class Car
  has_many :comments
end
这很好,但考虑到100条评论(其中大多数都有孩子的评论),它的表现还远远不够好。因此,我们可以轻松查找300多个用户/团队/组关联

我们如何预加载它们?我在想类似的事情

car.comments.include(:children,:owner)
但是对于变形关联来说这是如何工作的呢

render json: car.comments
在111ms内完成200 OK(视图:70.3ms |活动记录:34.8ms)

这实际上是总共10条注释的输出

[active_model_serializers]   User Load (7.0ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 2 LIMIT 1
[active_model_serializers]   Action::Comment Load (0.4ms)  SELECT `comments`.* FROM `comments` WHERE `comments`.`deleted_at` IS NULL AND `comments`.`parent_id` = 37 ORDER BY `comments`.`lft`
[active_model_serializers]   User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 1 LIMIT 1
[active_model_serializers]   Action::Comment Load (3.1ms)  SELECT `comments`.* FROM `comments` WHERE `comments`.`deleted_at` IS NULL AND `comments`.`parent_id` = 39 ORDER BY `comments`.`lft`
[active_model_serializers]   CACHE (0.0ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 2 LIMIT 1  [["id", 2], ["LIMIT", 1]]
[active_model_serializers]   Action::Comment Load (10.6ms)  SELECT `comments`.* FROM `comments` WHERE `comments`.`deleted_at` IS NULL AND `comments`.`parent_id` = 40 ORDER BY `comments`.`lft`
[active_model_serializers]   User Load (0.4ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 3 LIMIT 1
[active_model_serializers]   Action::Comment Load (0.4ms)  SELECT `comments`.* FROM `comments` WHERE `comments`.`deleted_at` IS NULL AND `comments`.`parent_id` = 41 ORDER BY `comments`.`lft`
[active_model_serializers]   User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 4 LIMIT 1
[active_model_serializers]   Action::Comment Load (0.4ms)  SELECT `comments`.* FROM `comments` WHERE `comments`.`deleted_at` IS NULL AND `comments`.`parent_id` = 42 ORDER BY `comments`.`lft`
[active_model_serializers]   User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 5 LIMIT 1
[active_model_serializers]   Action::Comment Load (0.4ms)  SELECT `comments`.* FROM `comments` WHERE `comments`.`deleted_at` IS NULL AND `comments`.`parent_id` = 43 ORDER BY `comments`.`lft`
[active_model_serializers]   User Load (0.3ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 6 LIMIT 1
[active_model_serializers]   Action::Comment Load (0.4ms)  SELECT `comments`.* FROM `comments` WHERE `comments`.`deleted_at` IS NULL AND `comments`.`parent_id` = 44 ORDER BY `comments`.`lft`
[active_model_serializers]   User Load (0.4ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 8 LIMIT 1
[active_model_serializers]   Action::Comment Load (0.6ms)  SELECT `comments`.* FROM `comments` WHERE `comments`.`deleted_at` IS NULL AND `comments`.`parent_id` = 45 ORDER BY `comments`.`lft`
[active_model_serializers]   Team Load (0.5ms)  SELECT  `teams`.* FROM `teams` WHERE `teams`.`id` = 2 LIMIT 1
[active_model_serializers]   Action::Comment Load (0.4ms)  SELECT `comments`.* FROM `comments` WHERE `comments`.`deleted_at` IS NULL AND `comments`.`parent_id` = 61 ORDER BY `comments`.`lft`
[active_model_serializers]   CACHE (0.0ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 2 LIMIT 1  [["id", 2], ["LIMIT", 1]]
[active_model_serializers]   CACHE (0.0ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 1 LIMIT 1  [["id", 1], ["LIMIT", 1]]
[active_model_serializers]   CACHE (0.0ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 2 LIMIT 1  [["id", 2], ["LIMIT", 1]]
[active_model_serializers]   CACHE (0.0ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 3 LIMIT 1  [["id", 3], ["LIMIT", 1]]
[active_model_serializers]   CACHE (0.2ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 4 LIMIT 1  [["id", 4], ["LIMIT", 1]]
[active_model_serializers]   CACHE (0.0ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 5 LIMIT 1  [["id", 5], ["LIMIT", 1]]
[active_model_serializers]   CACHE (0.0ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 6 LIMIT 1  [["id", 6], ["LIMIT", 1]]
[active_model_serializers]   CACHE (5.6ms)  SELECT  `users`.* FROM `users` WHERE `users`.`deleted_at` IS NULL AND `users`.`id` = 8 LIMIT 1  [["id", 8], ["LIMIT", 1]]
[active_model_serializers]   CACHE (0.0ms)  SELECT  `teams`.* FROM `teams` WHERE `teams`.`id` = 2 LIMIT 1  [["id", 2], ["LIMIT", 1]]
[active_model_serializers] Rendered ActiveModel::Serializer::CollectionSerializer with ActiveModelSerializers::Adapter::Attributes (95.65ms)