Это скорее вопрос «почему все работает так», а не вопрос «я не знаю, как это сделать» ...
Таким образом, Евангелие при извлечении связанных записей, которое, как вы знаете, вы собираетесь использовать, заключается в том, чтобы использовать его, :include
потому что вы получите соединение и избежите целого ряда дополнительных запросов:
Post.all(:include => :comments)
Однако, когда вы просматриваете журналы, никакого объединения не происходит:
Post Load (3.7ms) SELECT * FROM "posts"
Comment Load (0.2ms) SELECT "comments.*" FROM "comments"
WHERE ("comments".post_id IN (1,2,3,4))
ORDER BY created_at asc)
Он будет принимать ярлык , потому что он тянет все комментарии сразу, но все-таки не присоединиться (что вся документация , кажется, говорят). Единственный способ получить объединение - использовать :joins
вместо :include
:
Post.all(:joins => :comments)
И логи показывают:
Post Load (6.0ms) SELECT "posts".* FROM "posts"
INNER JOIN "comments" ON "posts".id = "comments".post_id
Я что-то упускаю? У меня есть приложение с полдюжиной ассоциаций, и на одном экране я отображаю данные по всем из них. Похоже, было бы лучше иметь один объединенный запрос вместо 6 отдельных. Я знаю, что с точки зрения производительности не всегда лучше выполнять объединение, а не отдельные запросы (на самом деле, если вы тратите время, похоже, что два вышеупомянутых отдельных запроса выполняются быстрее, чем объединение), но после всех документов Я читал, я удивлен, увидев :include
не работает, как рекламируется.
Может быть , Rails является сознают проблемы производительности и не присоединяется , за исключением некоторых случаев?
includes
(для тех, кто читает это)