Предварительная загрузка / включение полиморфных ассоциаций для сериализатора
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 комментариев