Rails: включить против: соединения
Это скорее "почему все работает именно так" вопрос, а не «я не знаю, как это сделать»; вопрос...
Таким образом, Евангелие при извлечении связанных записей, которые, как вы знаете, собираетесь использовать, заключается в использовании: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)
Этоis использование ярлыка, потому что он извлекает все комментарии одновременно, но все еще не является соединением (что, по-видимому, говорит вся документация). Единственный способ получить соединение - это использовать: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
не работает, как рекламируется.
Возможно рельсыis осведомлен о проблеме производительности и не присоединяется, кроме как в определенных случаях?