Предварительная загрузка / включение полиморфных ассоциаций для сериализатора

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

владелец может быть Teamили User или Group, У каждого из них есть атрибуты name, avatar(несущая волна) и created_at

эта проблема:

мы используем ActiveModel::Serializer для нашего ответа. (CommentSerializer). внутри сериализатора мы определили belongs_to :owner а также has_many :children,

render json: car.comments

это работает отлично, но это далеко от хороших результатов, учитывая набор из 100 комментариев (и большинство из них имеют детские). таким образом, у нас есть легкий поиск более 300 ассоциаций пользователей / команд / групп.

как мы можем предварительно загрузить их? я думал о чем-то вроде

car.comments.include(:children, :owner)но как это работает для ассоциации полиморф?

[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)

Выполнено 200 OK за 111мс (Просмотров: 70,3мс | ActiveRecord: 34,8мс)

Это на самом деле вывод в общей сложности 10 комментариев

0 ответов

Другие вопросы по тегам